如果我这样做:
int x = 10;
void *ptr = &x;
ptr++;
“ptr ++”行给出错误。
但是,如果不是“ptr ++”,我会这样做:
ptr = ptr + 1;
它运作得很好。可能是什么原因?
答案 0 :(得分:4)
Void指针算法在标准C中是非法的,但通常由gcc扩展名允许。
从概念上讲,这是因为当你对指针执行增量时,它实际上会在后台执行缩放以添加适当的字节数(由指针的类型给出),以使您进入下一个数据单元。 / p>
由于void指针可以指向任何类型,因此它可以使您无法以预期的方式访问内存部分。编译器无法确定如何扩展添加,因为它不知道指向的类型。
在标准C中,出于同样的原因,ptr = ptr + 1
也是非法的。你看到一件作品的原因是与gcc扩展相同的问题。
使用gcc
标志时,两者都会在-pedantic-errors
中给您错误。
答案 1 :(得分:1)
C标准禁止在void *上使用指针算术。取决于编译器。 原因很简单,C不是汇编: - )