2010-12-06 2 views
2
typedef struct { 

    unsigned char b1, b2; 

} cont; 

cont buf[1024]; 

int main(int argc, char *argv[]) { 

     FILE* fp; 

     fp = fopen(argv[1], "rb") 

     if(fp!=NULL) 

      fread(buf, sizeof (cont), sizeof (buf), fp); 

      //do something with buf 
      return 0; 

} 

Здравствуйте, я столкнулся с ошибкой ошибки сегментации, когда я пытаюсь запустить эту программу. Раньше она работала отлично, внезапно, сегма. Ошибка ошибки. Вызов функции fread вызывает ошибку. Пожалуйста, помогите мне!Ошибка сегментирования на предмет. Помогите!

+0

Программы не просто перестают работать так. Что вы изменили? Новая версия компилятора? Что-то другое? – 2010-12-06 10:13:12

+0

ничего, я использую netbeans IDE на платформе Windows, и я использую компилятор cygwin g ++ – user532053 2010-12-06 10:16:11

+0

третьим параметром должно быть количество элементов в буфере (что равно 1024), а не его размер в байтах (размер sizeof (buf)) – 2010-12-06 10:22:35

ответ

0

Всегда проверяйте возвращаемые значения. Как еще вы знаете, действительно ли вам удалось что-нибудь прочитать?

Я думаю, что это может быть из-за обивки. Тип «cont» определяется как 2 байта большой, но, вероятно, будет дополнен до 4. Однако это не должно вызывать проблемы, потому что даже если sizeof (cont) возвращает 2 или 4, «buf» должен использовать размер прокладок и так далее все еще достаточно большой.

3

Вы используете fread() неправильно - arg # 1 - это размер элементов для чтения, а arg # 2 - количество элементов для чтения (которое должно быть 1024 в вашем случае).

В результате вы читаете sizeof (cont) * sizeof (buf) байт и переполняют свой буфер.

См:

http://www.opengroup.org/onlinepubs/009695399/functions/fread.html

для документации функции.

Чтобы уточнить, вы хотите прочитать 1024 элемента, но sizeof(buf) - 2048 (по крайней мере, может быть, больше, если структура дополняется ABI вашей платформы).

Примеры (кодируется так, что они не зависят от конкретного числа элементов):

fread(buf, 1, sizeof(buf), fp); // fills the buffer (assuming it's buf[...]) 
fread(buf, sizeof(*buf), sizeof(buf)/sizeof(*buf), fp); // ditto 

Т.е. если вы хотите передать общий размер целевого буфера, через sizeof(), тогда другой аргумент должен быть одним, а если вы хотите передать размер структуры данных, тогда другой аргумент - это число из них, которое вписывается в буфер.

0

sizeof (buf) дает вам общее количество buf, а не только количество элементов в нем. Тем не менее, вы никогда не должны читать каждый непосредственно в структурах. Плохие вещи ждут вас, если вы это сделаете.

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

Чтобы ваша программа была переносной и безопасной, всегда читайте файлы по элементам и создавайте данные из этого.

int i; 
for(i = 0; i < MAX_ELEMENTS && !feof(fil); ++i) { 
    int c1, c2; 
    c1 = fgetc(fil); 
    c2 = fgetc(fil); 

    if(c1 == EOF || c2 == EOF) 
     break; 

    buf[i].c1 = c1; 
    buf[i].c2 = c2; 
} 

Это выглядит утомительно и многословно? Да, но это на добром причине. Всегда предполагайте, что содержимое файла может быть повреждено. Просто чтение файла в память предполагается опасно!

Смежные вопросы