2016-10-26 2 views
-1

Использование ниже гр фрагмента кодаFread приводит к переполнению кучи

char charString[1024]; 

if (fread(charString, sizeof_data, 1, filePointer) != 1){ return false;} 
else return true; 

Если я обеспечиваю sizeof_data = 1024 и файл указываемого filePointer имеют только 10bytes для чтения из файла. Я получаю сигнал прерывания от программы.

Как справиться с этим изящно?

+0

Ваша проблема в выделенном размере 'charString' скорее всего. –

+0

Изменен, чтобы исправить код. – Gaurav

+0

Что такое 'else true'? измените его на 'else return true'. –

ответ

2

То, что вы говорите, не может быть правдой: sizeof_data - 1024 и буфер тоже, поэтому проблем нет. Поэтому проблема заключается в коде, который вы нам не показываете. Две возможности:

  1. sizeof_data больше, чем буфер, и вы перезаписывать стек (или другие данные);

  2. Вы ожидаете, что прочитаете строку и не завершите ее с помощью `\ 0 ', а затем вы ее распечатаете, вызывая f/s/printf, чтобы вызвать segfault.

Попробуйте этот код:

char charString[1024]; 
    size_t n; 

    if ((n=fread(charString, 1, (sizeof_data<1024?sizeof_data:1023), filePointer))==0) 
     return false; 
    CharString[n]='\0';   // terminate 
    printf("%s\n",charString); // safe to print now 
    return true; 

Обратите внимание, что мы хотим, чтобы читать символы, так что размер пункт 1, и мы хотим, чтобы прочитать до 1023 из них, так что рассчитывать составляет не более 1024.

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