Сбой программы на C при вызове realloc () несколько раз - PullRequest
0 голосов
/ 14 февраля 2012

Последние несколько дней я работал над заданием для своего класса C и столкнулся с любопытным сбоем, связанным с функцией realloc () в C. Даже программисты на C / C ++ не могли ответить мне сразучто может быть не так с моим кодом.

Сначала я создаю блок памяти в одной функции:

char *line = (char *)malloc( sizeof(char) * BUFSIZE);

Затем я вызываю getMoreBuf(start_of_block, end_of_block)

int getMoreBuf(char *start, char *end)
{
char *newBuf = 0;
int newSize = (end - start) + BUFSIZE;
    newBuf = (char *)realloc(start, sizeof(char) * newSize);
    if(NULL == newBuf) {
        printf("No virtual RAM available");
    }else{
        start = newBuf;
    }
    return newSize;
}

В зависимости отто, что я установил для BUFSIZE, он вылетает после 5-го вызова (BUFSIZE = 1) или 3-го вызова (BUFSIZE = 5) и заменяет прочитанные символы на бессмысленные.

Может кто-нибудь указать мне на мою ошибку (s) и дать предложения, где почитать, чтобы исправить их?Любая помощь приветствуется.:)

Бонусный вопрос: Я выделяю блок памяти с указателем 1, указывающим на начальную, а затем указатель 2 на точку 2 на один блок в блоке памяти.Я realloc () блок и блок перемещается из-за проблем с размером, указатель 2 по-прежнему указывает на старый (теперь бесполезный) блок или он «перемещается» с realloc на новую позицию блока памяти?

(Также на будущее, должен ли я поставить этот дополнительный вопрос в новый вопрос или я могу оставить его здесь, поскольку он тесно связан с первым вопросом?)

Спасибо всемдля вашего вклада, мне очень помогло выяснить, что пошло не так.Если бы я мог, я бы пометил каждого как правильный ответ, так как каждый помог мне в некоторой форме понять немного больше обо всем этом бизнесе проклятых указателей.=)

Ответы [ 3 ]

3 голосов
/ 14 февраля 2012

Это:

start = newBuf;

модифицирует start. Но start является локальной переменной; это не повлияет на переменную, которая есть у вызывающей стороны.

Чтобы решить эту проблему, вам нужно либо взять start в качестве указателя на указатель, либо вам нужно вернуть newBuf.

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

Я думаю, что ваша проблема в том, что вы меняете только локальную переменную start ... Вам нужно использовать указатель.

int getMoreBuf(char **start, char **end)
{
    char *newBuf = 0;
    int newSize = (*end - *start) + BUFSIZE;
    newBuf = (char *)realloc(*start, sizeof(char) * newSize);
    if(NULL == newBuf) {
        printf("No virtual RAM available");
    } else {
        *start = newBuf;
        *end = *start + newSize;
    }
    return newSize;
}

И тогда вы бы назвали это как:

getMoreBuf(&start_of_block, &end_of_block)
2 голосов
/ 14 февраля 2012

Проблема в том, что новое значение start не передается из функции getMoreBuf() - для этого вам понадобится двойной указатель, то есть прототип вашей функции должен выглядеть следующим образом:

int getMoreBuf(char **start, char **end);

(я также сделал end двойным указателем, так как вам, вероятно, также понадобится вычислить новое значение для него.)

...