C语言中同类型指针相关的sizeof运算符返回结果不同的原因排查
为什么同类型相关操作的sizeof返回不同结果?
先把你的代码和输出贴出来,方便对照分析:
#include <stdio.h> #include <stdint.h> int main() { uint8_t a[22]={1,2,3,4,5}; uint8_t* p[2]={a}; printf("%d\n%d\n",&a,p[0]); printf("%d,%d",sizeof(a),sizeof(p)); return 0; }
输出:
606584768 606584768 22,16
核心原因:sizeof的计算对象本质是不同类型
你困惑的点在于两者都和uint8_t相关,但实际上a和p是完全不同的类型,sizeof会根据它们的真实类型计算占用字节数:
关于
sizeof(a)的结果22a是一个**uint8_t类型的数组**,长度为22。当sizeof直接作用于数组名时(注意:这是sizeof的特例,数组名不会像在函数传参场景那样隐式转换为指针),它计算的是整个数组的总字节数。
因为每个uint8_t占1字节,所以总大小就是22 * 1 = 22,这就是第一个输出数字的由来。
补充:你看到&a和p[0]的地址数值相同,是因为数组名a在赋值给p[0]时会隐式转换为指向数组首元素的指针,而&a是整个数组的地址,二者指向的内存起始位置一致,但类型不同(&a是uint8_t (*)[22]类型,p[0]是uint8_t*类型),不过这不影响sizeof对数组本身的计算。关于
sizeof(p)的结果16p是一个指针数组,它的每个元素都是uint8_t*类型的指针。你运行代码的环境是64位系统(从指针大小8字节能判断出来),所以每个指针占用8字节内存。
这个指针数组有2个元素,总大小就是2 * 8 = 16,这就是第二个输出数字的原因。
简单总结:a是存储uint8_t数据的数组,sizeof算的是所有元素的总大小;p是存储指针的数组,sizeof算的是所有指针的总大小——两者本质类型不同,结果自然不一样。
内容的提问来源于stack exchange,提问作者Saiteja Pabisetti
相关产品推荐
相关产品推荐

