64位架构下C语言所有指针均为8字节吗?不同指针大小疑问
指针类型大小的一致性问题解答
你测试的代码如下:
void fx(void) {} int main() { printf("%lu\n", sizeof(int*)); printf("%lu\n", sizeof(int**)); printf("%lu\n", sizeof(int****)); printf("%lu\n", sizeof(float*)); printf("%lu\n", sizeof(double*)); printf("%lu\n", sizeof(void*)); printf("%lu\n", sizeof(char*)); void(*p)(void); printf("%lu\n", sizeof(p)); }
针对你提出的问题,解答如下:
在64位(8字节)或32位(4字节)的主流通用平台(比如x86、x86_64架构)上,所有不同类型的指针大小都是一致的。但要注意,C语言标准并没有强制要求所有指针类型必须有相同的大小,这只是常见平台的实现惯例。
若出现不同类型指针大小不一致的情况,通常是以下原因:
- 特殊内存架构:比如16位x86系统的分段内存模型中,存在近指针(16位,仅指向当前段内地址)和远指针(32位,包含段选择子和偏移量),二者大小不同;
- 嵌入式/专用处理器优化:部分嵌入式平台或DSP为了节省内存空间,会针对不同数据类型使用不同宽度的指针,比如针对小型数据区域的窄指针;
- 地址空间分离:个别处理器的代码空间和数据空间是物理分离的,函数指针和数据指针需要访问不同的地址空间,因此设计成不同的大小。
内容的提问来源于stack exchange,提问作者alessio solari
相关产品推荐
相关产品推荐

