我试图编写一个小型C程序,但是一旦我尝试使用new_size重新分配它就会崩溃.20岁以下的new_size(在函数reallocate_buffer中)的每个值都可以正常工作。我不明白发生了什么。这是我的代码。
char* reallocate_buffer(char* buffer, unsigned new_size)
{
if (!buffer)
{
printf("Invallid buffer pointer given!\n");
printf("Press any key to continue...\n");
getchar();
exit(2);
}
realloc(buffer, sizeof(char) * new_size);
printf("Realloc is done...\n");
if (!buffer)
{
printf("Couldn't increase buffer size! Maybe out of memory?\n");
printf("Press any key to continue...\n");
getchar();
exit(1);
}
return buffer;
}
char* read_input(int* text_length)
{
unsigned bufsize = BUFFER_SIZE;
char* buffer = malloc(sizeof(char) * BUFFER_SIZE);
char c;
unsigned done = 0;
while((c = fgetc(stdin)) != EOF && c != '\n')
{
printf("C is now %d\n", c);
buffer[done] = c;
done += 1;
if (done == bufsize)
{
printf("Reallocating...\n");
printf("Buffer size was now: %d\n", bufsize);
bufsize += 5;
buffer = reallocate_buffer(buffer, bufsize);
printf("Buffer size is now: %d\n", bufsize);
}
}
/* Now increase size once more if necessary to place the \0 character */
if (bufsize == done)
{
printf("Reallocing once more...\n");
bufsize++;
reallocate_buffer(buffer, bufsize);
}
buffer[done] = '\0';
return buffer;
}
int main(int argc, char * argv [])
{
printf("Please provide input:\n");
int line_size;
char* word = read_input(&line_size);
printf("You provided:\n%s\n", word);
printf("Press any key to continue...\n");
getchar();
free(word);
return 0;
}
答案 0 :(得分:3)
您必须接收重新分配缓冲区的地址作为返回值,如
buffer = realloc(buffer, sizeof(char) * new_size);
答案 1 :(得分:1)
使用realloc()
的正确方法是
void *temp;
temp = realloc(buffer, new_size); // Note that: sizeof(char) == 1 ALWAYS
if (temp == NULL)
handle_allocation_error_or_exit(); // `buffer' is still valid here
else
buffer = temp;
的方式不存储返回的指针。您应该记住,realloc()
可能实际上free()
指针并重新分配新内存。但只有它能成功地这样做。
不使用临时指针有与之相关的问题,有几点要提到
free()
旧指针,因为您使用NULL
realloc()
失败,请致谢。当您使用具有+ 8GB RAM的系统时,malloc()
/ calloc()
/ realloc()
很难发生故障,但确实如此这不是不可能的。就我而言,有时候我正在运行一个视频会议程序并共享一个带有2GB内存的Windows 10 quemu虚拟机,同时使用网络浏览器,一些像Android Studio(它占用大量内存)的IDE + Android模拟器(再次qemu)。您可能会对RAM的消耗速度感到惊讶,在这种情况下,程序可能会在realloc()
失败并且您可能丢失了一些重要数据。
答案 2 :(得分:-1)
让我们回顾一下:
在C中,为了使函数更改参数,它必须将该参数作为指针接收。
但是如果那个参数是指针会发生什么?该函数必须将该指针作为指针的指针。
正如您所注意到的那样,realloc
并未将指针设为void**
,而是指向void*
,意味着它无法将指针更改为指向新的位置存储器中。
所以逻辑上,表达式为
realloc(ptr,new_size);
没有意义,内存地址已被更改,但不是指针。
这就是realloc
将新地址作为void*
返回的原因,您必须更新原始指针:
buffer = realloc(buffer, new_size);
P.S。 我不确定使用visual studio作为C IDE是最好的主意。