这是一个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
一二三
答案 0 :(得分:0)
由于list
是char**
类型的,因此您已经在此处为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()
释放动态分配的内存,以避免内存泄漏。