使用 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 终止。