2013-11-12 3 views
-1
#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char *buffer=malloc(1); 
    char *temporary=malloc(1); 
    int length=0; 
    signed int character; 
    for(length=0;(character = getchar())!=EOF;length++) 
    { 
     buffer[length]=character; 
     if((length==0) || ((length%1000)==0)) 
     { 
      temporary=realloc(buffer,length+1001); 
      if(temporary!=NULL) 
      { 
       buffer= temporary; 
      } 
      else 
      { 
       printf("Error: Out of memory!\n"); 
       free(temporary); 
       free(buffer); 
       return 1; 
      } 
     } 
    } 
    buffer[length]='\0'; 
    length-=1; 
    while(length>=0) 
    { 
     printf("%c",buffer[length]); 
     length--; 
    } 
    printf("\n"); 
    free(buffer); 
    //////////////free(temporary); //(HERE) 
    return 0; 
} 

Моя программа должна читать строку или текстовый файл ввода, хранить его и затем распечатывать обратно, что работает. Я просто не понимаю, почему я не могу сделать free временное значение в конце. Он не работает с double free error.Проблемы с распределением памяти

Хотелось бы знать, почему я не могу положить free(temporary), где я написал «здесь».

Если вы хотите указать еще одну проблему в моем коде, я рад чему-то научиться.

ответ

2

При выполнении этого кода линии

buffer = temporary; 

две вещи случаются. Во-первых, память, которую держала buffer, «просочилась»; у вас больше нет адреса для перехода на free(). Во-вторых, buffer и temporary теперь оба указывают на единицу памяти, выделенную malloc() или на realloc(). Таким образом, когда вы вызываете free() на buffer или temporary, вы освободили этот кусок памяти; для вызова free() снова была бы двойная свободная ошибка.

я предлагаю что-то вроде этого:

if (length >= buffer_size) 
{ 
    const size_t new_size = buffer_size + 1000; 
    char *temp = realloc(buffer, new_size); 
    if (!temp) 
    { 
     free(buffer); 
     /* handle the error in some way */ 
    } 
    buffer = temp; 
    buffer_size = new_size; 
} 

Кроме того, это лучшая практика на самом деле проверить на наличие ошибок. malloc() и realloc() может потерпеть неудачу.

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

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

EDIT: Я думаю, вы немного смутили насчет temporary. Посмотрите на код, который я положил, и вы увидите, что я поместил переменную temp в блок кода инструкции if. Более очевидно, как долго temp будет содержать полезное значение (не очень длинное). Объявление temporary во внешней области, а также вызов malloc(), чтобы поместить в него байт, просто запутывает.

+0

Если 'realloc' терпит неудачу, ваше предложение просочится. –

+0

@ KerrekSB, вы правы, и я исправлю это. – steveha

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