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 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
这个很可能是段错误,注定不正确的做法,楼主何必执意如此呢。

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧