С структурами: ошибка сегментации - PullRequest
2 голосов
/ 12 мая 2011

Быстрый вопрос о структурах:

struct xint {
     int number;
     char string[12];
};

int main(int argc, char *argv[])
{
  struct xint offsets, *poffsets;
  poffsets=&offsets;
  FILE * pFile = fopen("file","rb");
  fread(poffsets,1,16,pFile);
  printf("Number %d\nString %s\n",offsets.number,offsets.string);
}

Я получаю этот вывод

Number 12345
Segmentation fault

Я знаю, что, вероятно, что-то не так со структурами, указателями и распределением памяти. Заранее спасибо:)

Ответы [ 4 ]

2 голосов
/ 12 мая 2011

Ваша проблема в том, что вы непосредственно читаете в структуру из файла, не проверяя выравнивание структуры. Сделайте это вместо:

  fread(&offset.number,1,sizeof(offsets.number),pFile);
  fread(&offset.string,1,sizeof(offsets.string),pFile);
1 голос
/ 12 мая 2011

Я подозреваю, что данные файла, которые вы читаете, не заканчивают строку символом NUL ('\0').В соответствии с определением строк в C, которого придерживается printf() из стандартной библиотеки C, строка должна заканчиваться символом NUL.

Вы можете быть всегда готовы (через код) убедиться, что.string[11] = '\0'.

ИЛИ, объявите string[13] и убедитесь, что string[12] = '\0'

Кроме того, другой участник упомянул о проблемах выравнивания членов структуры.Это действительная проблема, которую вы также должны решить.

0 голосов
/ 12 мая 2011

Я предполагаю, что строка не оканчивается нулем в файле, и ваш код также ничего не делает для завершения строки нулем.

fread(poffsets, 1, 16, pFile);
offsets.string[11] = '\0';
printf("Number %d\nString %s\n", offsets.number, offsets.string);

Или измените файл так, чтобы строка оканчивалась нанулевой байт.

0 голосов
/ 12 мая 2011

Вы получаете переполнение буфера. Ваша строка содержит 12 символов, но у вас нет места для завершения '\0'.

Если вы сделали:

struct xint {
     int number;
     char string[16]; // Make sure you have enough space for the string + '\0'.
};

int main(int argc, char *argv[])
{
    struct xint offsets, *poffsets;

    // Initialize your memory to 0. This will ensure your string is 
    // '\0'-terminated.
    // FYI, sizeof(xint) here is 20.
    memset(&offsets, 0, sizeof(xint)); 

    poffsets=&offsets;
    FILE * pFile = fopen("file","rb");
    fread(poffsets,1,16,pFile);
    printf("Number %d\nString %s\n",offsets.number,offsets.string);
}

Это решит проблему.

...