char x[256] 与 char* = malloc(256*sizeof(char));

标签 c arrays malloc

最近这里有人在我正在使用的一段代码中向我指出

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/

相关文章:

Java 列和行

javascript - 数组包含其他数组中的所有元素

c - Malloc 初始化空指针

使用 execlp() 调用可执行文件

c - 使 OpenMP 程序与 Pthreads 一起工作,出现段错误

c++ - 指针类型的结构还是指针的结构?

c - 如何正确释放 malloc 的结构?

c - 未初始化的局部变量!

c - 复制文件程序中的 lseek 函数问题!

c - 为什么我们在 Linux 中需要 .so.1 文件?