为什么后缀增量对 void *ptr 不起作用,但 ptr = ptr + 1 有效?
Why does postfix increment not work on a void *ptr, but ptr = ptr + 1 works?
如果我这样做:
int x = 10;
void *ptr = &x;
ptr++;
第"ptr++"行报错
但是,如果我这样做而不是 "ptr++":
ptr = ptr + 1;
它工作得很好。可能是什么原因?
C 标准禁止对 void* 进行指针运算。虽然取决于编译器。
原因很简单,C不是汇编:-)
空指针算法在标准 C 中是非法的,但通常被 gcc 扩展允许。
从概念上讲,这是因为当您对指针执行递增时,它实际上会在后台执行缩放以添加适当数量的字节(由指针的类型给定),从而使您到达下一个数据单元.
由于 void 指针可以指向任何类型,因此可以避免以不同于预期的方式访问部分内存。编译器无法确定如何缩放加法,因为它不知道指向的类型。
在标准 C 中,ptr = ptr + 1
也是非法的,原因相同。您看到一项工作的原因是由于 gcc 扩展存在同样的问题。
当使用 -pedantic-errors
标志时,两者都会在 gcc
中给你错误。
如果我这样做:
int x = 10;
void *ptr = &x;
ptr++;
第"ptr++"行报错
但是,如果我这样做而不是 "ptr++":
ptr = ptr + 1;
它工作得很好。可能是什么原因?
C 标准禁止对 void* 进行指针运算。虽然取决于编译器。 原因很简单,C不是汇编:-)
空指针算法在标准 C 中是非法的,但通常被 gcc 扩展允许。
从概念上讲,这是因为当您对指针执行递增时,它实际上会在后台执行缩放以添加适当数量的字节(由指针的类型给定),从而使您到达下一个数据单元.
由于 void 指针可以指向任何类型,因此可以避免以不同于预期的方式访问部分内存。编译器无法确定如何缩放加法,因为它不知道指向的类型。
在标准 C 中,ptr = ptr + 1
也是非法的,原因相同。您看到一项工作的原因是由于 gcc 扩展存在同样的问题。
当使用 -pedantic-errors
标志时,两者都会在 gcc
中给你错误。