2015-03-08 3 views
0

Я имею ошибки сегментации на моем strcat в коде ниже:Сегментация Fault Использование 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 состоит из двух полукокса * и поплавка, который является числом от того, где я сортировкой файл.

+0

'strcat (first_string, tmp);' - вы не инициализировали 'first_string', который не выполняется' malloc() 'и' strcat() 'ожидает найти nul-терминатор. Если он не найдет его в 'first_string', он будет продолжать пахать память до тех пор, пока это не произойдет, тогда кто знает, куда он скопирует вашу другую строку? То же самое с 'final_string' и, возможно, и с другими, так как вы' malloc() 'загрузите материал, а затем приступите к работе с ним, не инициализируя ничего. –

+0

это может быть .... что вы предлагаете решить? –

+0

Используйте 'calloc()'. –

ответ

2

С кодом здесь

csv *earthquake = malloc(sizeof(csv*)*LINES_MAX); 

вы были отнесены массив указателей на Csv структур, но вы, кажется, предположить, что вы можете получить доступ к объектам структуры 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); 

EDIT:

Проверьте в параметре, что длины в нем не превышают выделенную вами длину. Также убедитесь, что строки in-string правильно завершены.

+0

да сэр! Я имел в виду, что ... однако он все еще не решил мою задачу 'strcat()' –

+0

Проверял длины строк? Нет. –

0

У вас возникла проблема с использованием strcat(), потому что вы не инициализируете ни одну из строк, которую вы используете в качестве цели.

strcat(first_string, tmp); 
... 
strcat(final_string, tmp); 

strcat() рассчитывает найти Нуль-терминатор, добавляемых затем следующую строку в. Если он не найдет его, он будет продолжать пахать память до тех пор, пока это не произойдет, тогда кто знает, куда он скопирует вашу другую строку?

Одним из решений было бы использовать 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(), был ли он инициализирован или он тоже случайный?

+0

извините, но это неправильно. нет ошибок от stardup ​​или моей инициализации в структуре ... calloc был реализован, как было предложено, и не решил проблему сегментации. –

+0

также эти строки работают одинаково в другой функции, которую я запускаю для печати всех значений. –

+0

Да, я удалил эту часть, но утечка памяти по-прежнему сохраняется, поскольку вы перезаписываете «землетрясение»> start_of_line = ... ' (который был для «землетрясения [0]») с «землетрясением [j] .start_of_line = ...' (и 'end_of_line'). –