【问题标题】:Garbage value while incrementing a void*增加 void 时的垃圾值*
【发布时间】:2011-09-02 08:23:21
【问题描述】:

这段代码:

#include <stdio.h>
int main(void)
{
   void *ptr;
   int arr[] = {1,2,3,4,5};
   ptr = arr;
   ptr++;
   printf("%d",*(int*)ptr);
}

打印一些垃圾值,但我希望它打印2。为什么不打印2

【问题讨论】:

  • 您在ptr++ 行没有收到编译错误吗?

标签: c pointers void-pointers


【解决方案1】:

您不能对 void 指针执行指针运算,因为编译器不知道指向对象的大小。

您的代码不会在 comeau online 上编译。我猜它是另一个邪恶的 gcc 扩展。

【讨论】:

【解决方案2】:

一些 C 编译器将 void 指针算术视为处理 char*。在 C++ 中无效。

不管怎样,你真的应该只增加非 void 指针,因为指针运算依赖于数据类型的大小和对齐方式的知识。

【讨论】:

  • “C 像对待 char* 一样对待 void 指针算术”——好吧,一些编译器出于历史原因这样做,但它是否是有效的 C 是有争议的。
  • @detly 是的,我可以看到我的答案不准确。我很难对 void 指针算法的细节感到兴奋,因为这显然是个坏主意。
  • 您的意思是为了纯粹的学术原因解决 C 标准的几个模棱两可的子条款不是你今天的亮点吗?
  • @DavidHeffernan 我来晚了。首先,很好的答案。想问一下:但是他的*ptr被赋值为指向int类型的数组的第一个位置,所以他没有增加void *,对吧?谢谢。
  • @Unheilig 增加变量的类型决定了增加的含义。
【解决方案3】:

试试

int *ptr

在这种情况下,ptr++ 按 int 的大小递增

【讨论】:

  • 您的语句不正确-(ptr++ 递增 4)。正确的语句应该是(ptr++ 递增 int 的大小)
猜你喜欢
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
  • 2022-06-14
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多