最近这里有人在我正在使用的一段代码中向我指出
char* name = malloc(256*sizeof(char));
// more code
free(name);
我的印象是这种设置数组的方式与使用
char name[256];
而且这两种方式都需要使用 free()。我错了吗?如果错了,有人可以用低层次的术语解释一下区别是什么吗?
最佳答案
在第一段代码中,内存是在堆上动态分配的。该内存需要使用 free() 释放。它的生命周期是任意的:它可以跨越函数边界等。
在第二个代码中,256 个字节分配在堆栈上,并在函数返回时自动回收(或者在程序终止时,如果它在所有函数之外)。所以你不必(也不能)在它上面调用 free() 。它不会泄漏,但也不会在函数结束后继续存在。
根据对内存的要求在两者之间进行选择。
附录(Pax):
如果我可以补充一点,Ned,大多数实现通常会提供比堆栈更多的堆(至少在默认情况下是这样)。这对于 256 字节通常无关紧要,除非您已经用完堆栈或执行大量递归操作。
此外,根据标准,sizeof(char) 始终为 1,因此您不需要多余的乘法。尽管编译器可能会优化它,但它会使代码变得丑陋恕我直言。
结束附录(Pax)。
关于char x[256] 与 char* = malloc(256*sizeof(char));,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/419022/