为什么C语言中void指针加1后编译器输出的地址仅偏移1字节
void指针加1偏移1字节问题解答
你运行的测试代码如下:
#include<stdio.h> int main() { int a =1025; int *p; p =&a; printf("Size of integer is %d bytes\n",sizeof(int)); printf("Address = %d , value = %d\n",p,*p); //void pointer void *p0; p0 = p; printf("address = %d",p0+1); }
核心原因说明
- 指针算术的底层规则:对任意类型的指针
T* p执行p + n操作时,实际的地址偏移量为n * sizeof(T)字节。比如你代码里的int*指针加1,就会偏移sizeof(int)(通常为4字节)。 void属于无类型,标准C语言没有定义sizeof(void)的合法取值,因此标准C完全不允许void*类型的指针直接做算术运算。如果你开启严格的C标准编译选项(比如gcc -std=c11 -pedantic),这段代码会直接编译报错,不会生成可执行文件。- 你看到的偏移1字节的运行结果,是GCC、Clang等主流编译器提供的非标准扩展特性:这类编译器为了简化内存操作场景的代码编写,自定义
sizeof(void) = 1,所以void*加1就会偏移1字节。这个行为不属于C标准的通用规定,跨平台开发场景下不要直接依赖该特性。
兼容写法建议
如果需要明确实现指针偏移1字节的效果,符合C标准的通用写法是先将void*强转为char*再做算术运算,C标准明确规定sizeof(char) = 1,不存在兼容性问题:
printf("address = %d", (char*)p0 + 1);
内容的提问来源于stack exchange,提问作者Himral Garg
相关产品推荐
相关产品推荐

