C程序通过多次调用realloc()来崩溃

时间:2012-02-14 08:55:11

标签: c visual-studio-2010 realloc

过去几天我一直在为我的C类工作上下班,并遇到了关于C中realloc()函数的奇怪崩溃。即使是内部的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)后崩溃,并用无意义替换读入的字符。

有人可以指出我的错误,并提出建议,在哪里阅读修复它们? 任何帮助表示赞赏。 :)

奖励问题:我用一个指针1指向一个内存块,然后指针2指向内存块中的一个块。我realloc()块和块由于大小问题而被移动,指针2是否仍然指向旧的(现在没用)块或者是否将realloc“移动”到内存块的新位置?

(同样对于将来,我应该将这个额外的问题放到一个新问题中,还是可以留在这里,因为它与第一个问题密切相关?)

感谢大家的投入,帮助我弄清楚出了什么问题。 如果我可以,我会将每个标记为正确的答案,因为每个人都以某种形式帮助我了解所有这些该死的指针业务。 =)

3 个答案:

答案 0 :(得分:3)

此:

start = newBuf;

正在修改start。但是start是一个局部变量;它不会影响调用者的变量。

要解决此问题,您需要将start作为指针指针,或者需要返回newBuf

答案 1 :(得分:2)

问题是start的新值没有传递出getMoreBuf()函数 - 你需要一个双指针才能做到这一点,即你的函数原型需要看起来像这样:

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

(我已将end设为双指针,因为您可能也需要为它计算新值。)

答案 2 :(得分:2)

我认为您的问题是您只是更改了局部变量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)