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_startprocpushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16movq    %rsp, %rbp
        .cfi_def_cfa_register 6movl    $40, -4(%rbp)   //看这里!!!!!!popq    %rbp
        .cfi_def_cfa 7, 8ret
        .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

sizeof是如何计算数组大小的相关推荐

  1. c/c++ sizeof(数组名) 的解析 sizeof如何计算数组大小

    按照传统,先给结论:sizeof(数组名) 的值是这个数组所占据的内存的大小,单位是字节(bytes),在32位机器上,假设一个int型的数组a,里面一共有10个int类型元素,那么sizeof(a) ...

  2. 数组名不等于指针---sizeof()函数求数组大小错误问题

    前言: 今天在项目中需要求采样点的数量并且遍历,采样点用数组存储,自定义了一个函数想要用sizeof求其长度,然后遍历,结果失败了,查阅之后发现以下问题: 在main函数中,sizeof是可以正常工作 ...

  3. 【C 语言】数组 ( 指针退化验证 | 计算数组大小 | #define LENGTH(array) (sizeof(array) / sizeof(*array)) )

    文章目录 一.指针退化验证 二.完整代码示例 一.指针退化验证 nnn 维数组 作为 函数参数 , 会退化为 指针 , 注意这里只有 最高维 第 nnn 维 会 退化为指针 , 该指针指向 若干 n− ...

  4. C语言高级编程:sizeof计算数组大小需要注意的问题

    测试平台:64位 X86 Ubuntu 1. 代码: #include <stdio.h>void main(void) {char a[20];printf("sizeof(a ...

  5. 关于sizeof表达式作为数组元素个数的编译

    想总结这方面的内容,是出于周一参加某公司的笔试题,有一道题是说定义一个整型数组,里面数组元素的个数是用sizeof(unsigned long)表示,这样是否合法?当时写的答案是不合法,因为平时写涉及 ...

  6. C++ 对数组sizeof 和对数组元素sizeof

    这一段程序 下面这段程序很有看点: //arr1 is an array of intsint *source=arr1; size_t sz=sizeof(arr1)/sizeof(*arr1);/ ...

  7. php求数组的长度的函数,php如何计算数组长度?

    php如何计算数组长度? 在PHP中,可以使用count() 或sizeof函数来获取数组中存在的元素的总长度或总数,计算数组长度. 方法一:count()函数 首先我们创建了一个数组,如下:$arr ...

  8. C语言实现动态数组大小

    C语言动态数组大小 C语言中的数组大小是固定的,定义的时候必须要给一个常量值,不能是变量.这带来了很大的不便,如果数组过小,不能容下所有数组,如果过大,浪费资源. //C语言动态分配数组大小 #inc ...

  9. 二维数组大小的确定!你真的是二维数组吗?

    昨天做了一道剑指Offer的题目,是关于dfs的题目,链接点这里 但是其中对于flag[][],二维数组的创建,起了疑惑.在上面链接里也放了关于用new建立二维数组的例子. 但是自己突然想测试一下,用 ...

最新文章

  1. Lnmp安装与配置笔记
  2. python订单管理系统功能_订单管理系统有哪些功能?
  3. ubuntu 安装pycharm
  4. python函数的嵌套调用_python函数的嵌套调用
  5. 接口测试--apipost变量使用(一)
  6. javaweb中运用fileupload上传文件
  7. xmind 软件画思维导图
  8. 思科路由器及交换机基本配置
  9. JIRA + FishEye + Crucible + Confluence + PostgreSQL
  10. 《实现领域驱动设计》 (美)弗农著 14章 应用程序
  11. python能处理nc文件吗_利用python如何处理nc数据详解
  12. 推荐的接口管理平台-yapi
  13. 3D打印鞋或将成为新时尚 Nike也加入
  14. 如何安装部署beego项目
  15. 滚动轴承特征频率计算推导过程
  16. 排序算法之——归并排序和快速排序
  17. 新版傻妞升级之后 登录 查询无反应
  18. tkMapper 简记
  19. 在线记录源码调试之@Qualifier源码分析
  20. 5月29日第十三届蓝桥杯国赛python中高年级组 小鸟看对方 题目、答案和解析

热门文章

  1. ftrack Review 双重校验
  2. IDEA设置阿里云maven仓库镜像mirror
  3. matlab contourf(data_100);,【MATLAB】contourf 基礎用法與對數作圖
  4. 安哥拉(Angola)CNCA船运证书是CONSELHO NACIONAL DE CARREGADORES DE ANGOLA的缩写
  5. 【渝粤题库】国家开放大学2021春2712园艺基础题目
  6. 东京迪斯尼海洋一日详细攻略+游记
  7. 基于词典方法和机器学习方法的中文情感倾向分析(毕业设计:附完整代码)
  8. python回文子串_LeetCode 647. 回文子串 | Python
  9. 一次考过PMP成功跳槽加薪!过来人传授PMP备考秘籍
  10. jupyter lab 的使用