取消引用Xcode上的void*警告

取消引用Xcode上的void*警告,xcode,compiler-errors,compiler-warnings,pointer-arithmetic,Xcode,Compiler Errors,Compiler Warnings,Pointer Arithmetic,我知道,而且。元素 这本书的新颖之处在于它对Xcode的关注,以及对 方括号用于取消对指向void的指针的引用 以下程序在Xcode 4.5.2编译时没有警告 尽管我没有VisualStudio,但GCC4.2和 现在,我记得它会认为这是一个编译器。 错误,MSDN和Internet同意 #include <stdio.h> int main(int argc, const char * argv[]) { int x = 24; void *xPtr = &am

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

以下程序在Xcode 4.5.2编译时没有警告 尽管我没有VisualStudio,但GCC4.2和 现在,我记得它会认为这是一个编译器。 错误,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);
}
它编译时在GCC和Xcode上都没有警告

我想知道如何将这种沉默转变为警告或错误,等等 GDB和尤其是Xcode/LLVM,包括函数main是int但 不显式返回任何值(我认为-Wall是这样做的)
GDB的诀窍。

这一点都没错……

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

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

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

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

*注意:在SO上键入内联--对于任何不起作用的代码,我深表歉意

xptr[1]!!!怎样??xPtr是指向空的指针。不是2D数组。@Anoop Vaidya:我知道它错了,Xcode没有,这让我很烦恼。是的,它不是2D数组,但也许你指的是“两元素数组”。我认为即使我写了xPtr[0],VisualStudio也会发出一个错误,我认为这太棒了,因为它没有错。。编译器不知道指针有多大。。。空虚,空虚谢谢你的回答。我觉得编译器总是知道指针有多大,我相信在大多数现代体系结构中它是4或8字节。它不知道点区域的大小,但这在编译时不是问题;您的答案似乎集中在这方面,因为您显示了对malloc的调用以分配所需的空间。我想Anoop Vaidya在某种程度上也提到了这个尺寸;当指向的类型不完整或无效时,编译时会出现问题,因为编译器没有给出大小信息,并且无法生成机器代码。
void *v = nil;
*v[1] = 0 //invalid

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