使用strcat()进行分段错误

时间:2015-03-08 19:53:48

标签: c string segmentation-fault 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 *和一个float,它是我对文件进行排序的数字。

2 个答案:

答案 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(),是初始化还是随机的?