duck__lu
2017-11-17 05:04
采纳率: 100%
浏览 1.6k

c/c++关于memset和sizeof的问题

 char a[5];
 memset(a, 0, sizeof(a));

我知道这条语句可以把数组a清零,但是sizeof(a)不是只把前8位清零了嘛,后面的32位应该没变啊,不是应该写成这样才对吗

 char a[5];
 memset(a, 0, sizeof(a) * 5);

是不是原理类似于int a[5] = {0};有些编译器会自动把后面的补0

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • xhl1376139719 2017-11-17 05:50
    已采纳

    这种写法很常见的,sizeof(a)如果a是数组,这是整个数组的字节长度,这里返回的是5,如果写成sizeof(a[0])则是返回1,也就是数组单个元素的长度。
    也就是说,你的第二行如果写成memset(a, 0, sizeof(a[0]) * 5);也是和第一行等价的。
    如果这里数组类型不是char而是int (假设在32位系统上)这返回的是5*4=20字节。单个元素就是4字节长度。
    你要记住的是sizeof返回的是字节长度。
    给你一点扩展知识,有时候还会碰到sizeof(char)或者sizeof(int) sizeof(unsigned int)这种写法,里面放的是类型。也是可以的,分别为1 4 4
    也就是类型所占字节的长度。更多地方还会在里面放结构体类型。如sizeof(struct node).这表示的是该结构体变量所占的字节大小.
    如果我的回答对你有帮助,请您采纳!不懂的可以继续问我。
    一枚上班还在偷偷答疑的“敬业”的程序员

    点赞 打赏 评论
  • barry_di 2017-11-17 05:19

    这位道友, sizeof后面加数组名,计算的是整个数组的占用的字节数,在你这里 sizeof(a) = 5个字节,memset第一个参数是要清除的内存的首地址,
    第二个参数是用来填充的值,第三个参数是你要清除内存的大小,单位是字节,你这里 memset(a, 0, sizeof(a)); 当然擦除的是5个字节了,5x8=40bit

    点赞 打赏 评论
  • xiaozhuai7 2017-11-17 06:18

    这个问题是这样的,对于数组类型,sizeof返回的是数组长度乘数组元素占用空间,如char a[5],就是5*1=5。
    当然如果你碰到了char a = (char)malloc(5); 这是sizeof(a)就不是5了,此时sizeof(a)和sizeof(char*)等价,也就等价于sizeof(void*),求的是一个指针变量占用的空间。
    那么在32位系统上返回4,64位系统上返回8。

    点赞 打赏 评论

相关推荐