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

各类指针的内存占用情况及持有变量地址与否的影响咨询

指针内存占用与sizeof行为解析

1. 指针变量本身的内存大小

在同一系统环境下,所有类型的指针变量(int*/void*/char*等)占用的内存大小固定,仅由系统的地址总线宽度决定:

  • 64位系统中,所有指针变量大小为8字节(对应你测试的结果);
  • 32位系统中,所有指针变量大小为4字节。

这是因为指针的本质是存储内存地址,地址的长度由系统地址空间宽度决定,和指针指向的具体类型无关。

2. sizeof(*指针):计算指针指向类型的大小

你观察到的sizeof(b)与sizeof(*b)结果差异,核心是两者的语义完全不同:

  • sizeof(b):计算指针变量自身的内存大小;
  • sizeof(*b):计算指针指向的对象/类型的内存大小。

int*案例解析

int main()
{
    int *b;
    printf("%d", sizeof(b)); // 输出8:指针变量本身的大小(64位系统)
}
int main()
{
    int *b;
    printf("%d", sizeof(*b)); // 输出4:int类型的默认大小(通常为4字节)
}

这里即使b是未初始化的野指针也不会报错——sizeof是编译期运算符,不会实际解引用指针,仅通过指针的类型推导指向对象的大小。

void*案例解析

void*是无类型指针,C标准未明确规定sizeof(*void*)的行为,但多数编译器会将其视为1字节(对应你测试的结果),这是因为void本身无明确大小,编译器默认用最小内存单位(1字节)处理。

而sizeof(void*)依然是指针本身的大小,因此64位系统下输出8,和其他指针类型一致。

3. 指针是否持有有效地址,不影响其内存占用

指针变量的内存大小只和系统架构(32/64位)有关,和指针是否初始化、是否指向有效内存完全无关。哪怕是未初始化的野指针,依然会占用固定大小的内存空间用于存储地址值(只是该地址值为随机无效值)。

比如你测试中void* b无论是否指向a,sizeof(b)的结果始终是8,因为指针自身的大小和它指向的内容无关。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:08