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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 07:09:00