2013-08-06 104 views
1

我不明白爲什麼編譯器警告我關於在此代碼中傳遞不兼容的指針類型:(在這種情況下void *void **之間有什麼區別)(我不知道這是否有所作爲,但我正在使用gnu99 C版)傳遞給void **而不是void *會讓編譯器抱怨類型,爲什麼?

void someFunc(void ** foo) { 
    printf("%s\n", *foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc(&text); 

    return 0; 
} 

和在預先

回答

6

void *此不

void someFunc(void * foo) { 
    printf("%s\n", foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc(text); 

    return 0; 
} 

由於是一類可隱式轉換爲任何對象指針類型並從其中轉換。 void **不是 - 所以當你可以指定一個char *void *,可以做同樣的char **void **

的原因是,他們是不兼容的類型:char **指向char *void **指向一個void *,所以他們的基本類型不匹配。

+0

好吧,理解,所以當我有一個交換功能,如 無效交換( ** a, ** b)交換指針,而不是值。如果我想使它通用(類型不敏感或其他)什麼是正確的方法來做到這一點? – Sasquash

+0

@Sasquash對不起,我沒有明白你的意思。爲了交換'T'類型的兩個值就足夠了'T *'。 – 2013-08-07 07:08:58

1

要解決你的代碼在第二個例子中,你可以做以下之一:

// Solution A, preferred: 
void someFunc(char * foo) { 
    printf("%s\n", foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc(text); 

    return 0; 
} 

在一個你告訴編譯器傳遞的參數是指向一個char。 我還沒有嘗試過解決方案B,應該工作,但爲什麼使用空洞,如果他們不是絕對必要的。

// Solution B, should work but a purist might object: 
void someFunc(void * foo) { 
    printf("%s\n", foo); 
} 

int main() { 

    char * text = "some text"; 
    someFunc((void *) text); 

    return 0; 
} 

在這個問題上沒有明顯的理由要使用雙PTR,所以解決方案用於您的第二個例子是可能的路要走。

相關問題