gpt4 book ai didi

c - 重新分配后我们会丢失缓冲区中的数据吗?

转载 作者:太空狗 更新时间:2023-10-29 16:21:42 26 4
gpt4 key购买 nike

我无法理解 realloc 的工作原理。如果我分配了一个缓冲区并将数据复制到该缓冲区,假设是“AB”:

 +------------+
| A | B | \0 |
+------------+

然后我重新分配缓冲区,会不会有任何数据丢失(即使是单个字节)?或者它只是扩大缓冲区? :

 +------------------------+
| A | B | \0 | ? | ? | ? |
+------------------------+

代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main(void){

char* buffer = (char*) malloc( sizeof(char) * 3 );
strncpy(buffer, "AB", 2);

buffer = (char*) realloc(buffer, sizeof(char) * 6); /* Will there be any lost here? */
free(buffer);
return(0);
}

最佳答案

增加 block 大小的realloc将保留原始内存块的内容。即使不能调整内存块的大小,旧的数据也会被复制到新的 block 中。对于减小块大小的 realloc,旧数据将被截断。

请注意,如果由于某种原因 realloc 失败,您对 realloc 的调用将意味着您将丢失数据。这是因为 realloc 因返回 NULL 而失败,但在这种情况下,原始内存块仍然有效,但你无法再访问它,因为你已经覆盖了指针将 NULL

标准模式是:

newbuffer = realloc(buffer, newsize);
if (newbuffer == NULL)
{
//handle error
return ...
}
buffer = newbuffer;

另请注意,从 malloc 转换返回值在 C 中是不必要的,并且根据定义,sizeof(char) 等于 1.

关于c - 重新分配后我们会丢失缓冲区中的数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9142805/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com