递增空指针

时间:2011-11-06 20:28:07

标签: c

  

可能重复:
  void * arithmetic

大家好。我有一个关于C中指针增量的小问题。首先我要知道ptr++,其中ptr是一个指针将增​​加sizeof(*ptr)。另外我知道在执行*ptr时,编译器知道它必须从内存中获取sizeof(*ptr)个字节。

第二部分帮助我理解为什么以下甚至不编译:

int main(){
 int a = 3;
 void* b = &a;
 printf("%d\n", *b);
 return 0;
}

因为编译器不知道类型void的变量的大小。但是,我对以下代码感到有点困惑:

int main(){
 int a = 3;
 void* b = &a;
 printf("%p\n", b);
 b++;
 printf("%p\n", b);
}

所以,我的两个问题是:

  1. 编译器如何知道应该增加多少b

  2. 为什么它只增加一个字节(至少在我的机器中是一个字节)?

1 个答案:

答案 0 :(得分:7)

1)它没有,2)那是未定义的行为。 void是一个不完整的类型,因此它没有明确定义的大小,所以你不能用它的指针进行指针运算。

通常,您需要char指针来进行字节方式的内存调整。

如果编译并启用所有编译器警告,您将发现此类有问题的代码。