【发布时间】:2015-03-08 19:53:47
【问题描述】:
在下面的代码中,我的 strcat 出现分段错误:
csv* lines_into_csv(int m,char* array[LINES_MAX][COLUMNS]){
char *first_string, *final_string;
first_string = (char*)calloc(400,sizeof(char));
final_string = (char*)calloc(400,sizeof(char));
csv *earthquake = malloc(sizeof(csv)*LINES_MAX);
int n, j;
for(j = 0; j < m; j++){
for(n = 0; n < COLUMNS; n++ ){
if (array[j][n] != NULL) {
if(n < 4){
strcat(first_string, array[j][n]);
}
else if(n == 4){
earthquake[j].mag = atof(array[j][n]);
}
else {
strcat(final_string, array[j][n]);
}
}
}
earthquake[j].start_of_line = (char*)calloc(200,sizeof(char));
earthquake[j].end_of_line = (char*)calloc(200,sizeof(char));
earthquake[j].start_of_line = strdup(first_string);
earthquake[j].end_of_line = strdup(final_string);
free(first_string);free(final_string);
}
return earthquake;
}
csv 类型结构由两个 char* 和一个浮点数组成,浮点数是我对文件进行排序的数字。
【问题讨论】:
-
strcat(first_string, tmp);- 你还没有初始化first_string这不是由malloc()完成的,strcat()期望找到一个 nul 终止符。如果它在first_string中找不到它,它会一直在内存中翻找直到找到,那么谁知道它将把你的另一个字符串复制到哪里呢?final_string和其他人也一样,因为你malloc()加载了很多东西,然后在不初始化任何东西的情况下继续使用它。 -
这可能是......你有什么建议解决它?
-
旁注:
sizeof(char*)完全是多余的。你应该使用sizeof(char),或者简单地使用1(因为这是char的大小根据定义)。 -
顺便说一下,
strcat期望两个指向 null-terminated 字符串的指针作为参数。您使用指向有效内存段的参数调用此函数,但这些段未使用以空值结尾的数据进行初始化。这会产生未定义的行为。 -
我的第二条评论(关于您没有将空终止字符串传递给
strcat)对于手头的问题更为重要。
标签: c string segmentation-fault strcat