我在下面的代码中对我的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 *和一个float,它是我对文件进行排序的数字。
答案 0 :(得分:2)
使用此处的代码
csv *earthquake = malloc(sizeof(csv*)*LINES_MAX);
你被分配了一个指向csv结构的指针数组,但你似乎假设你可以在这里访问struct csv的对象:
earthquake->start_of_line = (char*)calloc(200,sizeof(char));
earthquake->end_of_line = (char*)calloc(200,sizeof(char));
你可能意味着
csv *earthquake = malloc(sizeof(csv)*LINES_MAX);
修改强>
检查参数中的长度是否超过您分配的长度。还要确保in-strings正确地终止。
答案 1 :(得分:0)
使用strcat()
时出现问题,因为您没有初始化用作目标的任何字符串。
strcat(first_string, tmp);
...
strcat(final_string, tmp);
strcat()
期望找到一个nul终结符来追加下一个字符串。如果它没有找到它,它将继续翻阅内存直到它,那么谁知道它将你的其他字符串复制到哪里?
一种解决方案是使用calloc()
将0
写入其分配的内存。
还有另一个问题,内存泄漏。你已经在这里分配了内存 - 但仅限于第一个数组元素。
earthquake->start_of_line = malloc( 100*sizeof(char*));
earthquake->end_of_line = malloc( 200*sizeof(char*));
导致内存泄漏
earthquake[j].start_of_line = strdup(first_string);
earthquake[j].end_of_line = strdup(final_string);
您应该知道strdup()
分配更多内存并返回其指针,然后您将覆盖malloc()
返回的原始指针,因此不可能释放该内存,因为您不再拥有指针。
转到你用于array[][]
的函数参数dup()
,是初始化还是随机的?