c/c++ sizeof(数组名) 的解析 sizeof如何计算数组大小 | 您所在的位置:网站首页 › 如何用printf输出数组 › c/c++ sizeof(数组名) 的解析 sizeof如何计算数组大小 |
按照传统,先给结论:sizeof(数组名) 的值是这个数组所占据的内存的大小,单位是字节(bytes),在32位机器上,假设一个int型的数组a,里面一共有10个int类型元素,那么sizeof(a)的值就是10 * 4 = 40
原文链接:点击打开
sizeof是如何计算数组大小的 char *ptr; char arr[10]; sizeof(ptr) =4; sizeof(arr) =10;请问是如何计算数组大小的?这里只是把地址传给sizeof啊
严格讲, sizeof(arr) =10; 这里只是把地址传给sizeof啊 你这句话是错误的,你传的是数组名,数组名不等价于地址。 编译器用数组名标记数组的属性,比如具有确定数量的元素。 而你说的地址,也就是指针,只是一个标量值。 只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。而只有以下两种情况,才不被当做指针常量: sizeof(数组名):返回数组长度(所占的字节数,不是数组元素个数),而不是指向数组的指针的长度。 &数组名:产生一个指向数组的指针,而不是一个指向某个指针常量的指针。 以上内容来源:《C和指针》P141~142
sizeof(arr)这行不是程序执行到这里的时候才去求值的。所以不是你想的‘光凭指针如何知道数组长度’。 并且sizeof(arr)计算的数组所占字节数,并非数组长度,数组长度=sizeof(arr)/sizeof(char) sizeof是关键字,是在编译阶段处理的。也就是说你程序没有运行前,sizeof(arr)就被替换成了一个固定的常量,保存在了test.out中了。你可以试试这样写 sizeof ptr也是不会报错的,这说明了sizeof不是函数。 你想验证的话可以分阶段编译,看下处理结果: 1.源文件: #include int main(){ int a[10]; int b = sizeof a; }2.编译结果test.s 执行gcc -S test.c 你会发现编译阶段这里已经计算出了数组a的大小:40. 注意,这里的数组长度 = sizeof(a)/sizeof(int) = 40/4 = 10 |
CopyRight 2018-2019 实验室设备网 版权所有 |