2012-08-25 17 views
4

如果我有一個函數:爲什麼我不能一個指向字符緩衝區傳遞給函數PARAM字符**

void myfunction(char** s); 

然後我可以通過一個char *這樣的:

char* s = malloc(100); 
myfunction(&s); 

但我的編譯器不允許我這樣做:

char s[100] = {0}; 
myfunction(&s); 

我認爲,一個指向緩衝區應該由編譯器被允許。

+0

可能的重複[char *和char **之間的區別(在C中)](http://stackoverflow.com/questions/7065277/difference-between-char-and-char-in-c) –

+0

Bo Persson - 如何它可能與該鏈接重複? –

回答

4

您的函數需要一個指向指針的指針char **)。您嘗試將指針傳遞給數組,而不是(char (*)[100])。你爲什麼期望這個「被編譯器允許」?數組不是指針。數組和指針是完全不同性質的對象。指向指針的指針與指向數組的指針沒有任何兼容性。你不能交替使用它們。

如果你願意,你用你的基於陣列的緩衝與預計char **一個功能,你必須明確地創建一個指向該緩衝區第一

char s[100] = {0}; 
char *ps = s; 

,然後將指針傳遞到指針,如您之前做過

myfunction(&ps); 
+0

數組不是指針? –

+4

@SeçkinSavaşçı:的確如此。數組不是指針。 (爲什麼這種混淆如此持久?對於這個問題,就像有數千個解釋一樣,甚至沒有提到網絡上的大量常見問題)http://c-faq.com/aryptr/index.html – AnT

+1

數組的衰退是指向最輕微的挑釁,所以它*是奇怪的,他們不在這個場合。 – bitmask

0
#include <stdio.h> 
#include <stdlib.h> 
void myfunction(char* s[]){ 
    printf("Here: %s",s); 
} 
int main(){ 
    char s[100] = {'a'}; 
    //char s[100] = "myString"; 
    myfunction(&s); 
} 

這適用於Windows不知道在Linux上

+0

這個「有效」是因爲你的編譯器使用了非常寬鬆的錯誤檢查,並且因爲你的代碼包含了「偶數個錯誤」,它們相互補償(2個錯誤)。第一個錯誤是對'myfunction'的非法調用:它預計'char **',你提供'char(*)[100]'代替。第二個錯誤是對'printf'的無效調用:它期望'char *',而您提供'char **'。增加編譯器中的錯誤檢查級別,並且它應該捕獲這兩個錯誤(至少是第一個錯誤)。在C模式下試用這個http://comeaucomputing.com/tryitout,以獲得更多的書面分析。 – AnT

相關問題