过去几天我一直在为我的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“移动”到内存块的新位置?
(同样对于将来,我应该将这个额外的问题放到一个新问题中,还是可以留在这里,因为它与第一个问题密切相关?)
感谢大家的投入,帮助我弄清楚出了什么问题。 如果我可以,我会将每个标记为正确的答案,因为每个人都以某种形式帮助我了解所有这些该死的指针业务。 =)
答案 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)