【问题标题】:C program crashes by calling realloc() several times多次调用 realloc() 导致 C 程序崩溃
【发布时间】:2012-03-05 15:38:45
【问题描述】:

在过去的几天里,我一直在为我的 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) 后崩溃,并用废话替换读取的字符。

有人能指出我的错误并给出建议,在哪里阅读以解决这些错误? 任何帮助表示赞赏。 :)

额外问题:我 malloc 一个内存块,其中指针 1 指向开始,稍后指针 2 point2 指向内存块中的单个块。我 realloc() 块并且由于大小问题而移动了块,指针 2 是否仍然指向旧的(现在无用的)块,还是它与 realloc 一起“移动”到内存块的新位置?

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

感谢大家的意见,这对我找出问题所在有很大帮助。 如果可以的话,我会将每个都标记为正确答案,因为每个都以某种形式帮助我更多地了解所有这些该死的指针业务。 =)

【问题讨论】:

  • Even the programmers 也许你应该尝试过 C 程序员?
  • 是的,我试过一个 C 和一个 C++ 程序员,我只是忘了提及这一点。我解决了这个问题,我会查看链接。

标签: c visual-studio-2010 realloc


【解决方案1】:

这个:

start = newBuf;

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

要解决这个问题,您要么需要将start 作为指针到指针,要么需要返回newBuf

【讨论】:

  • @Plastefuchs:不,不会。你需要修改指针本身,所以你需要传递一个指向它的指针,即一个指向指针的指针。
  • 谢谢你的回答,它帮助我思考了一些我认为我已经知道的关于指针和函数的事情。
【解决方案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)

【讨论】:

  • 请注意,end 可能也需要重新计算 - 否则 newSize 的计算将提供错误的值...
  • 感谢您的回答!我曾希望有一些意见可以自己解决,但这也有效。我希望下次我能记住这一切。 :)
  • *start + newSize; 不起作用,我需要先从中减去 BUFSIZE。我需要再考虑一些时间来找出一个更整洁、更易于理解的方法来做到这一点。所以正是我需要的,更多的思考!
  • @Plastefuchs:您确定要减去BUFSIZE 而不是1
  • @Plastefuchs:顺便说一下,关于你的额外问题:指针没有改变,它被悬在坏记忆中。
【解决方案3】:

问题在于start 的新值没有从getMoreBuf() 函数中传递出去——您需要一个双指针来执行此操作,即您的函数原型需要如下所示:

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

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

【讨论】:

  • 感谢您的快速回答!
猜你喜欢
  • 2015-06-28
  • 2016-06-25
  • 2018-09-13
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-22
相关资源
最近更新 更多