如何修复c中的分段错误

时间:2019-04-20 17:35:27

标签: c

这是一个c编程问题,应该打印字符串一二和三,但是在不知道我的代码出了什么问题的情况下,它会不断出现分段错误,因为我做错了什么

这是一个c编程问题,应该打印字符串一二和三,但是在不知道我的代码出了什么问题的情况下,它会不断出现分段错误,因为我做错了什么

/*A sample run starts like this for the both of them    
    $ ./a.out    
    one two three   
   */    

// first try compiles with no errors and no warnings 
            int main(){
            char **list, word[20];
            int nwords;
            printf("Enter number of words: ");
            scanf("%d", &nwords);
            list = malloc(nwords * sizeof(char *));
            for(int i = 0; i< nwords; i++){
                scanf("%s", word);
                list[i] = word;
            }
            for(int i = 0; i < nwords; i++){
                printf("%s\n", list[i]);
            }
          }
              // second try compiles with no errors and no warnings
          int main(){
            char **list, word[20];
            int nwords;
            printf("Enter number of words: ");
            scanf("%d", &nwords);
            list = malloc(nwords * sizeof(char *));
            for(int i = 0; i< nwords; i++){
                scanf("%s", word);
                strcpy(list[i], word);
            }
            for(int i = 0; i < nwords; i++){
                printf("%s\n", list[i]);
            }
          }

这两个示例都开始这样运行
$ ./a.out
一二三

1 个答案:

答案 0 :(得分:0)

由于listchar**类型的,因此您已经在此处为list分配了内存

list = malloc(nwords * sizeof(char *));

但是您还没有为list[i]分配内存

list[i] = word; /* word base address gets copied to list[i] each time which is same*/  

因为word char数组,其名称本身是地址,所以list[i] 每次都分配有相同的基本地址,但您不希望这样做。

因此,要解决此问题,请首先为每个list[i]分配内存,然后使用strcpy()

list[i]分配内存,例如

for(int i = 0; i< nwords; i++){
    scanf("%s", word);
    list[i] = malloc(strlen(word)+1); /* allocate memory here */
    strcpy(list[i], word); /* copying the source string content to dest string content */
}

完成动态内存后,通过调用free()释放动态分配的内存,以避免内存泄漏。