2017-10-13 44 views
-2

我想輸入字符串列表。該列表可能會有所不同,所以我嘗試使用動態分配。每個字符串最多20個字符。該列表以一個點結束。我一直在努力一段時間,但我一直在分段錯誤,我不知道爲什麼。我想這個錯誤是在我使用realloc/malloc,但我不明白我到底做錯了什麼。代碼塊是一個更大的程序的一部分,但我挑出這個塊,並試圖使其工作。它適用於一個單詞後跟一個點的「列表」。只要我嘗試閱讀兩個或更多字符串的列表,就會看到分段錯誤。 任何幫助將是偉大的,謝謝!輸入使用動態分配的字符串列表c

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char **resizeDynamicArray(char **arr, int newSize){ 
    char **ptr = realloc(arr, newSize*sizeof(char*)); 
    if (ptr==NULL) { 
    printf("Error: memory allocation failed.\n"); 
    exit(-1); 
    } 
    return ptr; 
} 

int input (char ***seq){ 
    int len = 0; 
    char string[21]; 
    *seq=NULL; 

    do{ 
    scanf("%s", string); 
    if (string[0] != '.'){ 
     *seq = resizeDynamicArray(*seq, (len+1)); 
     *seq[len] = malloc(sizeof(char[21])); 
     strcpy((*seq)[len], string); 
     len++; 
    } 
    } while (string[0] != '.'); 
    return len; 
} 

int main(int argc, char *argv[]) { 
    int length; 
    char **words; 

    length = input(&words); 
    for (int i=0; i<length; ++i){ 
    printf("%s\n", words[i]); 
    } 
    for (int i=0; i<length; ++i){ 
    free(words[i]); 
    } 
    free(words); 
    return 0; 
} 
+3

一個三星級程序員應該能夠調試自己的程序。 – EOF

+0

查看['gdb'](http://www.gnu.org/software/gdb/documentation/) –

+0

對所有EOF沒有幫助。我遠離「三星級程序員」。我是新來的編碼和atm課程。謝謝帕特里克,我已經解決了。無論如何,我會看看它。 – Matt

回答

0

更改以下行:

*seq[len] = malloc(sizeof(char[21])); 

到:

(*seq)[len] = malloc(sizeof(char[21])); 

有額外的間接水平,需要索引頂級陣列之前,你可以取消引用。

+0

非常感謝。那正是錯誤的地方。它現在很好用。 – Matt