【问题标题】:Dereferencing void* warnings on Xcode取消引用 Xcode 上的 void* 警告
【发布时间】:2012-12-19 05:34:29
【问题描述】:

我知道this SO questionthis SO question。元素 这本书的新颖之处在于它对 Xcode 的关注,以及它对 Xcode 的使用 方括号取消引用指向 void 的指针。

以下程序在 Xcode 4.5.2 中编译没有警告,编译 在 GCC 4.2 上有一个警告,即使我没有 Visual Studio 现在,我记得它会认为这是一个编译器 错误,MSDN 和 Internet 同意。

#include <stdio.h>

int main(int argc, const char * argv[])
{
    int x = 24;

    void *xPtr = &x;
    int *xPtr2 = (int *)&xPtr[1];

    printf("%p %p\n", xPtr, xPtr2);
}

如果我将 main 正文的第三行更改为:

int *xPtr2 = (int *)(xPtr + 1);

它在 GCC 和 Xcode 上编译时都没有警告。

我想知道如何将这种沉默变成警告或错误,on GDB 和尤其是 Xcode/LLVM,包括函数 main 是 int 但 没有明确返回任何值(顺便说一下,我认为 -Wall 确实 GDB 的技巧)。

【问题讨论】:

  • xptr[1] !!!如何?? xPtr 是指向 void 的指针。不是二维数组。
  • @Anoop Vaidya:我知道这是错的,Xcode 没有,这让我很困扰。是的,它不是二维数组,但也许你的意思是“二元素数组”。我认为即使我写了 xPtr[0],Visual Studio 也会发出错误,我认为这非常棒。
  • 因为没有错..编译器不知道指针有多大...一个void[] ~~ void*

标签: xcode compiler-errors compiler-warnings pointer-arithmetic


【解决方案1】:

这根本没有错...

编译器不知道指针有多大...一个 void[] ~~ void*
这就是为什么用作字符串的 char* 需要 \0 终止

您不能为此打开警告,因为在编译时无法确定“指针指向的内存指针的大小”

void *v = nil;
*v[1] = 0 //invalid

void *v = malloc(sizeof(int)*2);
*v[1] = 0 //valid

*注意在 SO 上内联输入 - 抱歉任何不工作的代码

【讨论】:

  • 感谢您的回答。我觉得编译器总是知道指针有多大,而且我相信在大多数现代架构中它是 4 或 8 个字节。它不知道的是指向区域的大小,但这在编译时不是问题;您的答案似乎集中在这方面,因为您显示了对 malloc 的调用以分配所需的空间。我认为 Anoop Vaidya 在某种程度上也提到了这个尺寸;当指向的类型不完整或无效时,编译时会出现问题,因为编译器没有给出大小信息,也无法生成机器代码。
猜你喜欢
  • 2014-06-01
  • 1970-01-01
  • 2010-09-22
  • 1970-01-01
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多