ошибка сегментации странно - PullRequest
1 голос
/ 09 февраля 2012

Проблема: когда я пытался скомпилировать и запустить файл, возникла проблема с сегментацией. Когда я передал файл своему другу (он использует ту же версию Ubuntu), сервер сможет работать. Мне интересно почему?

Ниже будет мой код для всей страницы. Лично я чувствую, что с этим нет проблем, но я просто вставлю его для справки, если кто-нибудь попросит об этом.

void readNStoreData ()
{
char words[MAX];
char *wholeLine;
char* delimiter = ",";
int cflag = 0;
int x, count = 0;
char input;

FILE *countryFile;
countryFile = fopen("Countries.txt","r");

if (!countryFile) {
exit(EXIT_FAILURE);
}

while (fgets (words, MAX - 1, countryFile) != NULL)
{
    //atof to convert string to double
    //split a single line into individual tokens indicating , as the delimeter
    //afterwards store them into array
    wholeLine = strtok (words, delimiter);
    strcpy (records [count].TDL, wholeLine);
    wholeLine = strtok (NULL, ",");
    strcpy (records [count].cName, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].FIPS104, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].ISO2, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].ISO3, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    records [count].ISO = atof(wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cCapital, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cRegion, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cCurrencyName, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    strcpy (records [count].cCurrencyCode, wholeLine);
    wholeLine = strtok (NULL, delimiter);
    records [count].cPopulation = atof(wholeLine);
count++;
}
fclose(countryFile); //close file
}

Надеюсь, кто-нибудь сможет где-нибудь заметить ошибку. Спасибо заранее тем, кто помог!

запустите GDB, и ошибка на самом деле в этой строке. он находится в этой функции.

    l(gdb) frame 1
    l#1  0x08048936 in readNStoreData () at testserver.c:61
    61                      strcpy (records [count].cName, wholeLine);

Ответы [ 2 ]

2 голосов
/ 09 февраля 2012

I настоятельно рекомендует научиться использовать отладчик , например GDB .Вы можете установить его в Ubuntu с помощью sudo apt-get install gdb

Вот краткое руководство .

Google находит много других примеров

РЕДАКТИРОВАТЬ :

Поскольку теперь у вас работает GDB, попробуйте установить точку останова до run:

(gdb) br testserver.c:61

и после выполнения run вы должны иметь возможность print различных переменных и видеть, какая из них недопустима.

0 голосов
/ 09 февраля 2012

Ваш звонок на strcpy не удался.В него передаются неверные параметры (см. Документацию http://www.opengroup.org/sud/sud1/xsh/strcpy.htm).

Если вы хотите us проанализировать это, вам нужно показать нам

  • как определяется records,
  • как определяется тип структуры элемента,
  • как вы инициализируете массив records, сколько элементов,
  • как вы ограничиваете count, чтобы не выходить за пределы емкости records
  • , как вы убедитесь, что records[count].cName (предположительно, char* или char[]) достаточно большой, чтобысодержит токен, проанализированный как strtok

    Примечание Максимально возможный токен составляет MAX символов, поскольку это может быть длина строки MAX, возвращаемая fgets + 1 завершающий символ NUL, если на входе нет ни одного символа delimiter.

Это должно помочь вам.

У меня есть подозрение, что вывозможно, забыл полностью инициализировать принимающий массив (records), но, опять же, мы не сможем узнать, пока вы не покажете больше cода.

...