2010-10-01 66 views
0

快速C問題在這裏。我們最近一直在玩雙,三,甚至四分球。我們雖然我們對事物的把握,直到我們遇到了這個問題...C - 通過函數調用迷路的雙指針

char ***data; 
data_generator(&data); 
char **temp = data[0];   
printf("printing temp[%d]: %s\n",0, temp[0]); 
printf("printing temp[%d]: %s\n",1, temp[1]); 
dosomething(temp); 

int dosomething(char **array) { 

    printf("printing array[%d]: %s\n",0, array[0]); 
    printf("printing array[%d]: %s\n",1, array[1]); 
    ...... 
} 

int data_generator(char ****char_data) { 
    char *command1[2]; 
    char *command2[2]; 

    command1[0] = "right"; 
    command1[1] = "left"; 

    command2[0] = "up"; 
    command2[1] = "down"; 

    char **commandArray[2]; 

    commandArray[0] = command1; 
    commandArray[1] = command2; 

    number_of_commands = 2; 

    if(number_of_commands > 1){ 
    *char_data = commandArray; 
    } 

    return number_of_commands - 1; 
} 

而這種打印出...

printing temp[0]: right 
printing temp[1]: left 
Segmentation fault 

貌似我對所發生的指針一些誤解同時通過一個函數。有什麼想法嗎?

+0

呃,char ***數據的大小是4字節(在一個32位機器上),你的代碼假設它有點大...... – 2010-10-01 04:28:24

+0

我沒有看到任何分配... – 2010-10-01 04:32:32

回答

3
*char_data = commandArray; 

你是把疊層(自動)數組的地址在外部存儲器位置。這是災難的原因(未定義的行爲),因爲commandArray的生命期一旦結束,data_generator就會返回。 commandArray的元素也是如此,它們本身是指向堆棧數組元素的指針。

+0

感謝答覆。爲了確保我在這裏清楚,因爲commandArray中的所有元素都在data_generator的範圍內聲明,所以只要data_generator返回,系統就可以取消分配這些對象。那是對的嗎?我用於Objective-C,其中「保留」是解決方案。什麼是C等價物? – Staros 2010-10-01 04:58:15

+0

它可以(也可以,雖然你可能不會馬上被咬),但是會釋放所有的自動變量。這包括數組'command1','command2'和'commandArray'。一般的解決方案是使用調用者提供的內存,或者'malloc'。 – 2010-10-01 05:09:47

0

變化:

char *command1[2]; 
char *command2[2]; 

到:

static char *command1[2]; 
static char *command2[2]; 

這將保持命令1 []和在保留存儲器命令2 []。

或者malloc()他們,就像其他海報推薦的那樣,儘管正確使用malloc'c內存需要比我在這裏討論的更多的考慮。

+0

你應該提到,對於很多實際的例子(當涉及多於常量時),這將使它不可重入。 – 2010-10-01 18:07:32