如何在C中返回未使用的已分配内存?

如何在C中返回未使用的已分配内存?,c,string,memory,malloc,C,String,Memory,Malloc,例如,如果我在C字符串上分配了更多的内存空间,那么有没有办法返回未使用的内存?或者这是自动完成的 char *x = malloc(256); strcpy(x, "Hello World"); // return back unused x memory allocation 您可以调用realloc更改分配的大小;这可以用来使它变大或变小 计算机将没有依据自动缩小您的分配。这不是自动完成的。这就是手动内存管理的好处和坏处 您需要显式地调用free(x)将内存释放回操作系统。跟踪malloc

例如,如果我在C字符串上分配了更多的内存空间,那么有没有办法返回未使用的内存?或者这是自动完成的

char *x = malloc(256);
strcpy(x, "Hello World");
// return back unused x memory allocation

您可以调用
realloc
更改分配的大小;这可以用来使它变大或变小


计算机将没有依据自动缩小您的分配。

这不是自动完成的。这就是手动内存管理的好处和坏处

您需要显式地调用
free(x)
将内存释放回操作系统。跟踪
malloc()
/
free()
对是一件痛苦的事情,但这是值得的,因为您可以对程序使用的内存进行细粒度控制

如果您只想分配确切的内存量,那么您应该这样做。通常,当您调用
malloc()
时,您不知道编译时的分配大小,因此通常会分配确切的内存量


如果您想要一个增长/收缩内存缓冲区,您应该考虑到
malloc()
是一个昂贵的调用。所以,你通常会分配足够的内存,这是对你需要多少内存的一个很好的估计,当你知道它不会增长更多时,你会缩小它,如果你估计得太少,你会缩小它。

@Arvnid!!!这在中国是不存在的。并且如果您在C++中使用,则调用未定义的行为,因为在分配< <代码>新< /C> >时使用<代码>删除<代码>。在这种情况下,它将是
x=new[256]
然后也
删除x
错误,它将是
delete[]x
.BWT:
char*x=strdup(“你好世界”)或至少
char*x=malloc(12);如果(x!=NULL)strcpy(x,“Hello World”)
。如果您知道只使用12个字节,那么为什么不使用
malloc(12)
而不是256?完成@Pablo的注释,您应该准确地使用
malloc()。所以当你知道了,你现在应该知道到底有多少。@IharobAlAsimi如果在编译时内存空间是未知的呢?例如,在一个用于用户输入或读取文件以及处理未知字符串大小的程序中,有什么好处?@ScottHunter您可以很好地控制程序的内存分配。如果您非常小心,并使用正确的工具,您将能够编写内存效率高的代码,而不会出现任何错误。我认为这比“好”更“有用”,但YMMV@IharobAlAsimi在查找YMMV时,您的里程可能会有所不同。事后将字符串重新定位为字符串+1的长度安全吗?例如:
char*x
x=malloc(256)
strcpy(x,“你好”)
x=realloc(x,(strlen(x)+1))只要您不尝试访问已解除分配的部分,当然。@lostAtSeaJoshua
x=realloc(x,(strlen(x)+1))可能无法重新分配,甚至无法分配到更小的分配,因此请检查返回值。这取决于您希望使代码具有多大的弹性。@chux是的,我在realloc上添加了返回null时的错误处理。