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

指针异常行为疑问:无类型转换赋值与void指针自增问题

关于C语言指针类型转换和void指针自增的疑问解答

问题1:int直接赋值给char未报错的原因

C语言标准明确规定,不同非void指针类型之间的隐式赋值属于约束违反,编译器必须给出诊断信息(警告或错误)。但你使用的GCC 9.4.0默认采用了宽松的编译策略,仅对这种隐式转换输出警告(而非直接报错终止编译),因此代码能正常编译运行。

如果开启更高等级的警告(比如添加编译选项-Wall)或强制将警告视为错误(-Werror),编译器就会拒绝编译这类代码,完全符合标准规则。

另外,代码能运行是因为所有指针类型在底层都存储内存地址值,隐式转换后pointer拿到了ptr的地址,但后续通过char*类型访问内存时,会按1字节的步长解析数据——这也是你输出中*pointer为1、*(pointer+1)为4的原因(1025的二进制是00000000 00000000 00000100 00000001,小端模式下低字节在前)。

问题1代码

int a = 1025;
int *ptr = &a;
printf("The size of integer is = %d\n", sizeof(int));
printf("The address = %d, value = %d\n", ptr, *ptr);
printf("The address = %d, value = %d\n", ptr+1, *(ptr+1));

char *pointer;
pointer = ptr;
printf("The size of character is = %d\n", sizeof(char));
printf("The address = %d, value = %d\n", pointer, *pointer);
printf("The address = %d, value = %d\n", pointer+1, *(pointer+1));

运行输出

The size of integer is = 4
The address = 15647756, value = 1025
The address = 15647760, value = 15647756
The size of character is = 1
The address = 15647756, value = 1
The address = 15647757, value = 4

问题2:void指针能执行自增操作的原因

C语言标准中,void*是无类型指针,无法确定指向数据的大小,因此不允许对void*进行指针算术运算(包括自增、自减、加减整数)。但GCC提供了非标准扩展,默认将void类型的大小视为1字节,所以ptr1+1会将地址值加1,得到你看到的结果。

这种行为是GCC独有的扩展,不属于标准C,在其他编译器(如Clang、MSVC)中可能直接报错,或者有不同的处理方式。如果要遵循标准C,必须先将void*强制转换为具体类型的指针(如(char*)ptr1 + 1)再进行算术运算。

问题2代码

int a = 1025;
int *ptr = &a;
printf("The address = %d, value = %d\n", ptr, *ptr);
void *ptr1;
ptr1 = ptr;
printf("%d\n", ptr1+1);

运行输出

The address = 15647756, value = 1025
15647757

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:40:36