[综合信息] 关键字sizeof

[复制链接]
 楼主| AdaMaYun 发表于 2024-7-30 11:16 | 显示全部楼层 |阅读模式

不知道有多少人最初认为sizeof是一个函数。其实它是一个关键字,其作用是返回一个对象或者类型所占的内存字节数,对绝大多数编译器而言,返回值为无符号整形数据。需要注意的是,使用sizeof获取数组长度时,不要对指针应用sizeof操作符,比如下面的例子:

  1. void ClearRAM(char array[])  
  2. {
  3.      int i ;
  4.      for(i=0;i<sizeof(array)/sizeof(array[0]);i++)     //这里用法错误,array实际上是指针  
  5.      {
  6.          array[i]=0x00;
  7.      }
  8. }

  9. int main(void)  
  10. {
  11.      char Fle[20];

  12.      ClearRAM(Fle);          //只能清除数组Fle中的前四个元素  
  13. }

我们知道,对于一个数组array[20],我们使用代码sizeof(array)/sizeof(array[0])可以获得数组的元素(这里为20),但数组名和指针往往是容易混淆的,有且只有一种情况下数组名是可以当做指针的,那就是**数组名作为函数形参时,数组名被认为是指针,同时,它不能再兼任数组名。
**注意只有这种情况下,数组名才可以当做指针,但不幸的是这种情况下容易引发风险。在ClearRAM函数内,作为形参的array[]不再是数组名了,而成了指针。sizeof(array)相当于求指针变量占用的字节数,在32位系统下,该值为4,sizeof(array)/sizeof(array[0])的运算结果也为4。所以在main函数中调用ClearRAM(Fle),也只能清除数组Fle中的前四个元素了。

suncat0504 发表于 2024-7-30 19:52 | 显示全部楼层
确实如楼主所说,在传递参数时,程序中使用sizeof容易出问题。我感觉一般用作计算固定类型所占空间时,比较安全。
suncat0504 发表于 2024-7-30 19:52 | 显示全部楼层
做程序员看起来挺容易,实际工作中要考虑的事情很多,一个不注意,就会产生莫名其妙的错误,而且原因还不好找。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

296

主题

2472

帖子

6

粉丝
快速回复 返回顶部 返回列表