过去几天,我一直在为我的 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 指向内存块中的单个 block 。我 realloc() block 并且由于大小问题移动了 block ,指针 2 是否仍然指向旧的(现在无用的) block 或者它是否随着 realloc“移动”到内存块的新位置?
(同样为了将来,我应该把那个额外的问题放到一个新问题中还是我可以把它留在这里因为它与第一个问题密切相关?)
谢谢大家的意见,这对我找出问题所在有很大帮助。 如果可以的话,我会将每个标记为正确答案,因为每个都以某种形式帮助我更多地了解所有这些该死的指针业务。 =)
最佳答案
这个:
start = newBuf;
正在修改开始
。但是 start
是一个局部变量;它不会影响调用者拥有的变量。
要解决这个问题,要么将start
作为指向指针的指针,要么返回newBuf
。
关于C 程序通过多次调用 realloc() 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9274023/