我只是想问一下是否需要对 C 中的 int
或 bool
等值使用 malloc()
。虽然这听起来很愚蠢,但我只是想更深入地了解 C。我已经看到了malloc()
的大量用途,并且已经发现malloc()
允许在需要时轻松重新分配数组。
如果不涉及数组或结构,有人介意告诉我是否需要使用malloc()
吗?
No.没有真正的理由动态分配单个基元类型变量。除了除非必要,否则应避免堆分配的传统观点之外,不这样做的最简单原因如下。
- 基元类型具有恒定的大小。因此,在这种情况下动态调整大小是没有意义的。
- 使用指针将基元类型变量传递给某个函数并不比按值传递更具优势。
动态内存分配的两个主要用途是:
答:您需要的内存多于堆栈上可用的内存。(例如,大型内存缓冲区(。在这种情况下,你永远不会malloc
像 int 或 bool 这样小的东西。
b:你需要一些内存,这些内存必须持久存在于函数范围之外。在这种情况下,您必须按住指向已分配对象的指针。如果指针不小于对象,则没有正当理由为此使用堆内存。
但是,malloc()
仍然经常用于分配如此少量的内存,在编译时大小未知的情况下 - 例如动态分配的字符串。
总结:- 是的,你可以写
int *c= malloc(sizeof(int));
但我从未见过这样做的有效案例。
首先,对堆栈和堆内存的一些见解,
叠::
当程序开始在函数 main(( 中执行时,空格为 在堆栈上为 main(( 中声明的所有变量分配。如果 main(( 调用一个函数,为 堆栈顶部的该函数中的变量。请注意, main(( 传递给函数的参数也存储在 叠。当函数返回时,其局部变量的存储为 已解除分配。堆栈区域中分配的内存被使用和重复使用 在程序执行期间。应该清楚的是,分配的内存 此区域将包含以前使用中剩余的垃圾值。
堆::
我们可以使我们的程序更加灵活,如果在执行过程中可以 在需要时分配额外的内存,在不需要时释放内存 需要。执行期间的内存分配称为动态内存 分配。C 提供库函数来分配和释放内存 在程序执行期间动态。动态内存分配于 系统的堆。
现在,假设您必须读取一个文件,例如"abc.txt",但您不知道文件的大小。该文件可以只有 1KB,也可以是 10KB。因此,如果您制作一个大小为 10*1024 字节的字符数组,那就不好了,因为当文件大小仅为 1KB 时,您只是在浪费剩余的内存量。因此,在诸如此类(以及许多其他情况(的情况下,您应该在运行时获取文件大小后使用malloc
,并且在使用后释放内存。因此,优化代码使用更少的内存量。
我只是想问是否需要在 C 中使用 malloc(( 来表示 int 或 bool 等值。
不,虽然你可以使用,但没有必要。在源程序中定义变量时,变量的类型确定编译器分配的内存量。当程序执行时,变量会消耗此内存量,而不管程序是否实际使用分配的内存。对于数组和其他基元数据类型尤其如此。
malloc 可以允许指向基元的指针在声明它们的块结束后保持有效。考虑具有全局 int 指针g_var的文件中的以下两个函数:
int* g_var;
void foo( ) {
int stackVar = 10;
g_var = &stackVar;
}
void bar( ) {
int* heapVar = malloc(sizeof(int));
*heapVar = 10;
g_var = heapVar;
}
在 foo 结束后,堆栈 Var 不复存在。*g_var 的值将是未定义的,它可以指向任何值,更改它指向的值可能会导致未定义的行为或使程序崩溃。相比之下,当柱线结束时,g_var仍然指向分配的内存:*g_var 将按预期等于 10,并且不会引起问题。
也就是说,您应该避免做这样的事情。当您可以仅使用堆栈执行某些操作时,最好避免堆。在这个例子中,g_var可能应该只是一个全局 int 而不是一个 int 指针,并让函数相应地更改它。