为什么postfix增量在void * ptr上不起作用,但是ptr = ptr + 1有效?

时间:2015-07-19 17:13:58

标签: c pointers void-pointers

如果我这样做:

int x = 10;
void *ptr = &x;
ptr++;

“ptr ++”行给出错误。

但是,如果不是“ptr ++”,我会这样做:

ptr = ptr + 1;

它运作得很好。可能是什么原因?

2 个答案:

答案 0 :(得分:4)

Void指针算法在标准C中是非法的,但通常由gcc扩展名允许。

从概念上讲,这是因为当你对指针执行增量时,它实际上会在后台执行缩放以添加适当的字节数(由指针的类型给出),以使您进入下一个数据单元。 / p>

由于void指针可以指向任何类型,因此它可以使您无法以预期的方式访问内存部分。编译器无法确定如何扩展添加,因为它不知道指向的类型。

在标准C中,出于同样的原因,ptr = ptr + 1也是非法的。你看到一件作品的原因是与gcc扩展相同的问题。

使用gcc标志时,两者都会在-pedantic-errors中给您错误。

答案 1 :(得分:1)

C标准禁止在void *上使用指针算术。取决于编译器。 原因很简单,C不是汇编: - )