为什么要在 char 或数组以外的原始数据类型上使用 malloc?C.



我只是想问一下是否需要对 C 中的 intbool 等值使用 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 指针,并让函数相应地更改它。

相关内容

  • 没有找到相关文章

最新更新