2017-04-01 164 views
0

我試圖使用釋放calloc創造1000個字符長字符串動態數組:動態字符串數組dosent工作

int i; 
char** strarr =(char**)calloc(argc,sizeof(char)*1000); 
if(strarr == NULL) 
    return 0; 
strarr[0][0] ='a'; 
printf("%c\n",strarr[0][0]); 

每次我嘗試運行這段代碼我上的printf線分割的錯,我不明白爲什麼會發生這種情況(您可以假定argc大於0) 謝謝

Ps對不起,該代碼是在文本格式,但使用im移動,所以我沒有這個代碼功能

+0

'strarr [0]'是一個空指針。 'strarr [0] [0]'是未定義的行爲。 – aschepler

回答

0

試試這個:

const int num_of_strings = 255; //argc ? 
const int num_of_chars = 1000; 

int i; 
char** strarr =(char**)malloc(sizeof(char*)*num_of_strings); 

if(strarr == NULL) 
    return 0; 
for (i = 0; i < num_of_strings; i++) strarr[i] = (char*)malloc(sizeof(char)*num_of_chars); 
+0

是的,這工作!非常感謝你 –

0

您好,歡迎來到世界的不確定的行爲,最黑暗的地區之一的C語言。你的代碼有幾個問題,這些問題會在多個場合導致未定義的行爲,但它們都會被執行,直到你到達printf行,你正在訪問內存,你還沒有分配,最終被系統捕獲,因此,產生分段故障。

但我認爲,最好是通過自己的代碼走自己的路。

  1. 變量i,這是在int i;行聲明未在已發佈的代碼的任何地方使用,但我猜你以後需要它。
  2. 第一段代碼,這是不正確的,在第二行,你聲明一個字符串數組或char**。這意味着你有一個指向字符指針的指針。所以,你真正想要做的是爲這些指針分配內存,而不是爲他們指向的字符分配內存。請注意,char消耗的內存量不同於char*。因此,這條線是與之相關的。

    char** strarr = (char**) calloc(argc, sizeof(char*)); 
    

    這將用於存儲器的argc塊,每個塊的大小是4或8個字節,這取決於系統是否是32或64位的分配內存。

  3. 您在檢查calloc函數是否返回NULL方面做得非常好,這是一個非常好的整體實踐。

  4. 接下來,您將需要爲指針所指向的字符串自身分配內存,爲其分配了上一行中的內存。這些線將做到這一點。

    for (int i = 0; i < argc; i++) { 
        strarr[i] = (char*) calloc(1000, sizeof(char)); 
    } 
    

    這將爲我們argc大小的字符串數組的每個元素分配1000個字符的長字符串。

之後,你可以繼續你的代碼,因爲它是,我認爲不會產生錯誤。請接受我的額外建議。學習愛Valgrind。這是一個非常有用的程序,您可以運行代碼,以分析內存。這是我的第一步,每當我遇到分段錯誤時。