可能重复:
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);
}
所以,我的两个问题是:
编译器如何知道应该增加多少b
?
为什么它只增加一个字节(至少在我的机器中是一个字节)?
答案 0 :(得分:7)
1)它没有,2)那是未定义的行为。 void
是一个不完整的类型,因此它没有明确定义的大小,所以你不能用它的指针进行指针运算。
通常,您需要char
指针来进行字节方式的内存调整。
如果编译并启用所有编译器警告,您将发现此类有问题的代码。