memset(,0,) 和 {0} 初始化一个复杂结构的区别

kd8608 2009-01-07 09:30:55
TMyStruct tMyStruct1 = {0};
TMyStruct tMyStruct2;
memset(&tMyStruct2,0,sizeof(tMyStruct2));
...全文
1119 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
太乙 2009-01-08
  • 打赏
  • 举报
回复
up~~~
huangpeng8612 2009-01-08
  • 打赏
  • 举报
回复
两种方式完全一样。效率也一样。对于初始化,如果要初始化的内容比较多,编译器会自己给你加上memset。
gbb21 2009-01-08
  • 打赏
  • 举报
回复
复杂的话,两个都不能用。比如这个结构体里面带函数。
waizqfor 2009-01-07
  • 打赏
  • 举报
回复
一个效果 只不多用一个函数 能多浪费点时间
gnidnuy 2009-01-07
  • 打赏
  • 举报
回复
={0} 只能在声明的时候用 , memset可以在任何地方
nineforever 2009-01-07
  • 打赏
  • 举报
回复
根据标准
If there are fewer initializer-clauses in the list than there are members in the aggregate, then each member
not explicitly initialized shall be value-initialized
所以tMyStruct1.a[0]是被初始化为0,而tMyStruct1.a[1]是value-initialized(对于基本类型,等价于初始化为0)。

你提到的有的时候tMyStruct1.a[1]不为0可能是由于部分编译器对value-initialization支持有问题的缘故(比如VC和GCC)。
china_west 2009-01-07
  • 打赏
  • 举报
回复
不知道
考试要挂
kd8608 2009-01-07
  • 打赏
  • 举报
回复

typedef struct {
char a[2];
};
TMyStruct tMyStruct1 = {0};
TMyStruct tMyStruct2;
memset(&tMyStruct2,0,sizeof(tMyStruct2));


但是tMyStruct1.a[1]有的时候是不为0的

我想知道有没有什么样的规律?
过去的我 2009-01-07
  • 打赏
  • 举报
回复
初始化说穿了就是一段内存赋值..不过赋的是0而已..生成的指令差不了多少..
nineforever 2009-01-07
  • 打赏
  • 举报
回复
复杂结构不一定能用memset。而{0}保证结构能够正确地初始化。
而且通常编译器会根据情况将{0}优化成memset
xiaoyisnail 2009-01-07
  • 打赏
  • 举报
回复
效果一样,后者多一个函数调用的开销

70,027

社区成员

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

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