c - 递增一个空指针

标签 c

<分区>

Possible Duplicate:
void * arithmetic

大家好,我有一个关于 C 中指针递增的小问题。首先,我知道 ptr++,其中 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) 它没有,2) 那是未定义的行为。 void 是一个不完整的类型,所以它没有明确定义的大小,所以你不能用它的指针进行指针运算。

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

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

关于c - 递增一个空指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8030140/

相关文章:

c - 在C编程中使用 "fgetc"从PPM文件中找到RGB总和(0)的最小值?

c - EXC_BAD_ACCESS 的 minishell malloc 错误

c - 不知道为什么我收到 Glibc 检测到错误

c - 数组声明,C

c - 如何在linux中打印时间

c - 如何部分预处理具有特定工作目录的 C 文件

c - 在 C 代码中搜索已安装的 DEB 包的优雅方法

objective-c - 为什么不需要取消引用 NSString 指针?

c - 在 C 中声明全局多维数组

c - 家庭作业问题,国际象棋皇后的可用字段