sizeof是如何计算数组大小的


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<stdio.h>
int main(){
    int a[10];
    int b = sizeof a;
}

2.编译结果test.s
执行gcc -S test.c

        .file   "test.c"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $40, -4(%rbp)   //看这里!!!!!!
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
        .section        .note.GNU-stack,"",@progbits

你会发现编译阶段这里已经计算出了数组a的大小:40.
注意,这里的数组长度 = sizeof(a)/sizeof(int) = 40/4 = 10



文章来源:https://segmentfault.com/q/1010000003848156

  • 32
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值