2016-02-09 2 views
1

Я пытаюсь определить функцию, которая принимает файл указатель файла, который уже был открыт и указатель на структуру типа String, которые я определил в качестве таковых:Как определить ошибку сегментации?

typedef struct string { 
    char* char_arr; 
    int capacity; 
    int size; 
} String; 

Это должно возвращать 1, если функция могла читать из файла и помещать первое слово в строку, а 0 - нет. Однако, когда я его запускал, я получаю сообщение об ошибке сегментации. Я читал, что это связано с неправильным использованием указателя, но мне трудно найти, где это произошло.

int string_extraction(FILE* pFile, String* pString){ 
    char* c_string; 
    int i; 
    char c; 

    fscanf(pFile, " %c", &c); 

    for(i=0; !isspace(c) && c != EOF; i++){ 
    c_string[i] = c; 
    c = fgetc(pFile); 
    } 
    ungetc(c, pFile); 

    pString = (String*)malloc(sizeof(String)); 
    if (pString != NULL) { 
    pString->size = i; 
    pString->capacity = i+1; 
    pString->char_arr = (char*)malloc(sizeof(char) * (pString->capacity));   
    if (pString->char_arr == NULL) { 
     free(pString); 
     pString = NULL; 
    } else pString->char_arr = c_string; 
    } 

    if(pString == NULL) 
    return 0; 
    return 1; 
} 
+0

Возможно, вы захотите прочитать следующее: http://c-faq.com/stdio/getcharc.html - Google, используемые функции stdio, и посмотрите их подписи, убедитесь, что вы передали правильный параметр типа и проверьте возвращаемые значения. – Adam

ответ

1

, как вы просили «как определить» на Segfault, а не ошибка в коде здесь несколько слов об этой теме ...

вы можете запустить программу в отладчике, который способен поймать такую ​​ошибку и направлять вас в нужное место в коде. если вы используете среду, которая предлагает вам инструменты GNU, вы можете использовать gcc и gdb.

, чтобы иметь возможность получить максимальную отдачу от GDB вам нужно перекомпилировать программу, чтобы добавить символы отладки:

gcc -g your-awesome-program.c -o your-awesome-program 

вы можете прочитать о GDB отладки флагов here. не

не запустить программу в GDB:

gdb your-awesome-program 

типа г (+ ввод), чтобы запустить приложение, и вы получите некоторый вывод, как показано ниже:

(gdb) r 
Starting program: /some/where/over/the/rainbow/a.out 

Program received signal SIGSEGV, Segmentation fault. 
0x0000000000400775 in string_extraction (pFile=0x601010, pString=0x7fffffffe310) at ex.c:31 
31  c_string[i] = c; 
(gdb) bt 
#0 0x0000000000400775 in string_extraction (pFile=0x601010, pString=0x7fffffffe310) at ex.c:31 
#1 0x000000000040072a in main() at ex.c:18 
(gdb) 

Линия c_string [i] = c; сообщает вам, где произошел segfault. Команда bt показывает вам стек вызовов, чтобы вы могли следить за потоком вашего приложения, пока оно не было убито плохим происшествием.

Вы можете узнать больше о gdb here.

Изучение того, как отлаживать использование отладчика, такого как gdb, сэкономит вам много времени.

0

символ * c_string;

Segfault, потому что ваш указатель c_string неинициализирован.

Либо используйте char [] или malloc указатель перед его использованием в цикле.

for(i=0; !isspace(c) && c != EOF; i++){ 
    c_string[i] = c; // <-- segfault as c_string not initialized 
    ... 
}