递增空指针

Fre*_*red 0 c

可能重复:
void*算术

嗨伙计们,我有一个关于C中指针增量的小问题.首先我要知道,指针将ptr++在哪里ptr增加sizeof(*ptr).我也知道*ptr,在编写时,编译器知道它必须sizeof(*ptr)从内存中获取字节.

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

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

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

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

所以,我的两个问题是:

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

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

Ker*_* SB 7

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

通常,您需要char指向字节方式内存摆弄的指针.

如果在启用所有编译器警告的情况下进行编译,则会发现此类有问题的代码.