社区
C语言
帖子详情
memset(&数组的名称, 0, 数组的大小)会怎么样?
z341223318
2011-10-25 10:37:35
[size=16px]
trap_type_enable_t
TrapTypeEnables[MAX_SNMP_TRAP_TYPE];
memset(&TrapTypeEnables,0x0,sizeof(
TrapTypeEnables
));
因为TrapTypeEnables是数组名,已经是地址了,但是memset初始化时,又&TrapTypeEnables进行取地址,
请问初始化的具体是什么,会出现段错误吗?[/size]
...全文
356
11
打赏
收藏
memset(&数组的名称, 0, 数组的大小)会怎么样?
[size=16px]trap_type_enable_t TrapTypeEnables[MAX_SNMP_TRAP_TYPE]; memset(&TrapTypeEnables,0x0,sizeof(TrapTypeEnables)); 因为TrapTypeEnables是数组名,已经是地址了,但是memset初始化时,又&TrapTypeEnables进行取地址, 请问初始化的具体是什么,会出现段错误吗?[/size]
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
11 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
七擒关羽
2011-10-25
打赏
举报
回复
trap_type_enable_t TrapTypeEnables[MAX_SNMP_TRAP_TYPE];
memset(&TrapTypeEnables,0x0,sizeof(TrapTypeEnables));
因为TrapTypeEnables是数组名,已经是地址了,但是memset初始化时,又&TrapTypeEnables进行取地址,请问初始化的具体是什么,会出现段错误吗?
-------memset的基本用法出现错误
void *memset(void *s, int ch, unsigned n);
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
LZ的用法变成对某地址进行清理
z341223318
2011-10-25
打赏
举报
回复
太深奥了。
赵4老师
2011-10-25
打赏
举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
z341223318
2011-10-25
打赏
举报
回复
关键是我程序刚起来第一次执行memset(&TrapTypeEnables,0x0,sizeof(TrapTypeEnables))时没问题,
然后自定义一个信号SIG_USER2。当收到SIG_USER2信号再次执行memset(&TrapTypeEnables,0x0,sizeof(TrapTypeEnables))时,程序退出了,并生成core file文件,用GDB调试,是memset出现了问题?
www_adintr_com
2011-10-25
打赏
举报
回复
和普通变量不同的是,数组名做为右值时表示的并不是地址中的内容,而是地址本身!所以对于数组 array 有一个令人吃惊的性质: array == &array。数组的这个性质可以让你使用 array[i] 来访问数组元素,而不必使用 (&array)[i] 来访问数组元素,虽然后者才是更符合语法的写法。因为 C 语言对下标的解释是按照 addr + i * sizeof(T) 来解释的(根据加法的交换律也可以写成 i * sizeof(T) + addr,所以数组也可以按照 i[array] 形式来访问。在 C 中这除了让你的代码酷一点外没有其他用处,不过在 C++ 中可以借此来区分重载了 operator[] 的自定义类对象和原始指针操作),要进行下标操作的必须是一个地址,所以数组名即使作为右值也当作地址来解释的。这种特殊的方式让 C 语言数组在概念上变得异常复杂,而仅仅是为了访问数组元素的时候能有一个简单的语法。
www_adintr_com
2011-10-25
打赏
举报
回复
[Quote=引用 4 楼 z341223318 的回复:]
trap_type_enable_t TrapTypeEnables[10];
你的意思当TrapTypeEnables定义成数组。
memset时,TrapTypeEnables和&TrapTypeEnables是一样的?
怎么可能?
[/Quote]
事实就是这样,你可以测试下.
这个是 C 语言为了实现数组的语法才这样的.
参考 http://blog.adintr.com/43
<< C 专家编程>>
自信男孩
2011-10-25
打赏
举报
回复
测试了一下,没有出现段错误。只是在编译后会有一个警告:不匹配的隐式声明'memset'函数。
z341223318
2011-10-25
打赏
举报
回复
trap_type_enable_t
TrapTypeEnables[10];
你的意思当TrapTypeEnables定义成数组。
memset时,TrapTypeEnables和&TrapTypeEnables是一样的?
怎么可能?
www_adintr_com
2011-10-25
打赏
举报
回复
对于数组
&array === array
z341223318
2011-10-25
打赏
举报
回复
我就想知道
memset(&TrapTypeEnables,0x0,sizeof(TrapTypeEnables));
到底初始化了什么?
为什么有时候没有问题,也不报段错误。
孤独小剑
2011-10-25
打赏
举报
回复
这个很可能是段错误,注定不正确的做法,楼主何必执意如此呢。
c/c++ 学习总结 初学者必备
21、为什么
数组
名作为参数,
会
改变
数组
的内容,而其它类型如int却不
会
改变变量的值? 答: 当
数组
名作为参数时,传递的实际上是地址。而其他类型如int作为参数时,由于函数参数值实质上是实参的一份拷贝,被调函数内部对...
c++
memset
语言_C/C++中的
数组
和
数组
的
memset
函数
1.
数组
介绍1.1 什么是
数组
?
数组
就是把相同数据类型的变量组合在一起而产生的数据集合。从
数组
定义中可以看出
数组
主要有两个方面:相同数据类型的变量;数据集合;对于第一点比较好理解,对于第二点简单来说就是把...
C语言中的
数组
和多维
数组
是什么?如何遍历
数组
并初始化?
声明和初始化多维
数组
的方式与一维
数组
类似,只需要指明
数组
的类型、
名称
和维度即可。这里声明了一个长度为10的整型
数组
,其中包含了10个元素,但是这些元素现在都是未初始化的,所以默认是0。这里先使用sizeof操作...
如何确定C语言中
数组
的
大小
?
如何确定C语言中
数组
的
大小
? 也就是说,
数组
可以容纳多少个元素?
精通到熟悉C系列1——函数&
数组
&指针&结构体
一次申请,
数组
大小
就不变了。 int main() { int n; int a[]; scanf("%d",&n); printf("%d\n",sizeof(a)); n =100; printf("%d\n",sizeof(a)); n = 10; printf("%d\n",sizeof(a)); return 0; } ...
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章