2017-10-13 94 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