You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)的结果22
    a是一个**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)的结果16
    p是一个指针数组,它的每个元素都是uint8_t*类型的指针。你运行代码的环境是64位系统(从指针大小8字节能判断出来),所以每个指针占用8字节内存。
    这个指针数组有2个元素,总大小就是2 * 8 = 16,这就是第二个输出数字的原因。

简单总结:a是存储uint8_t数据的数组,sizeof算的是所有元素的总大小;p是存储指针的数组,sizeof算的是所有指针的总大小——两者本质类型不同,结果自然不一样。

内容的提问来源于stack exchange,提问作者Saiteja Pabisetti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 06:34:09