使用 strcat() 的分段错误
Segmentation Fault Using strcat()
我的 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()
时出现问题,因为您没有初始化用作目标的任何字符串。
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()
分配了更多的内存和 returns 它的指针,然后你覆盖了 malloc()
返回的原始指针,因此将无法释放该内存,因为您不再有指针。
继续讨论您用于 dup()
的函数参数 array[][]
,它是初始化的还是随机的?
代码在这里
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-parameter里面的长度不要超过你分配的长度。还要确保字符串正确地以 0 终止。
我的 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()
时出现问题,因为您没有初始化用作目标的任何字符串。
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()
分配了更多的内存和 returns 它的指针,然后你覆盖了 malloc()
返回的原始指针,因此将无法释放该内存,因为您不再有指针。
继续讨论您用于 dup()
的函数参数 array[][]
,它是初始化的还是随机的?
代码在这里
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-parameter里面的长度不要超过你分配的长度。还要确保字符串正确地以 0 终止。