0

我知道this SO questionthis SO question。在這個新穎的元素 是在它的焦點在Xcode,並在其使用 方括號去引用void指針。取消引用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); 
} 

如果我改變主要以身體的第三行:

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

它編譯與GCC和Xcode中沒有任何警告。

我想知道我怎麼可以把這個沉默到警告或錯誤,就 GDB和尤其的Xcode/LLVM,包括功能主要爲int,但 沒有明確返回任何值的事實(由我認爲的方式 - 牆上做 GDB的伎倆)。

+0

xptr [1] !!!怎麼樣?? xPtr是指向void的指針。不是二維數組。 –

+0

@Anoop Vaidya:我知道這是錯的,Xcode不會,這讓我很煩惱。是的,這不是一個二維數組,但也許你的意思是「二元數組」。我認爲即使我寫了xPtr [0],Visual Studio也會發出一個錯誤,我認爲這是完全可怕的。 – damix911

+0

,因爲它沒有錯..編譯器不知道指針有多大...一個void [] ~~ void * –

回答

0

原位缺口錯在所有...

編譯器完全不認識的指針有多大......一個void [] ~~無效*
這就是爲什麼字符*作爲字符串必須是\ 0封端的

因爲它不是可能的「通過指針內存指針的大小,以」在編譯時

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

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

*註上鍵入SO直列確定你不能在警告打開爲 - 對不起對於任何非工作代碼

+0

感謝您的答案。我覺得編譯器總是知道指針有多大,我相信在大多數現代體系結構中它是4或8個字節。它不知道的是指向區域的大小,但這在編譯時不是問題;你的答案似乎集中在這方面,因爲你顯示一個malloc調用來分配所需的空間。我認爲Anoop Vaidya也以某種方式提到了這個尺寸;編譯時出現的問題是指向的類型不完整或無效,因爲編譯器沒有給出大小信息,也不能生成機器碼。 – damix911