0

我知道这个 SO question这个 SO question。这篇文章的新颖之处在于它对 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 上编译时都没有警告。

我想知道如何在 GDB尤其是Xcode/LLVM 上将这种沉默转变为警告或错误,包括函数 main 是 int 但没有显式返回任何值的事实(顺便说一下,我认为 -Wall 可以解决问题在 GDB 上)。

4

1 回答 1

0

这根本没有错...

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

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

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

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

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

于 2013-01-04T19:50:04.587 回答