【问题标题】:Understanding the purpose of malloc and calloc了解 malloc 和 calloc 的用途
【发布时间】:2012-01-17 21:06:33
【问题描述】:

我正在努力理解 C。通读 K&R,我来回浏览,试图找到它说明我应该动态获取内存块的情况。

例如,我想要一个 int 指针。

int *pointer;

然后 K&R 表示我可能想做:

int *pointer;

pointer = (int*)malloc(sizeof(int));

基本上,我在这里做了什么不同的事情?在第一种情况下,我创建了一个指针,它还没有指向任何东西,所以我猜如果计算机内存不足,我尝试将它指向一个 int 值我会遇到问题。第二种情况为我的指针保留空间。所以我不必担心我的程序有那么多内存问题。它是否正确? 如果这是正确的,我不应该为我创建的每个指针使用 malloc(或 calloc)吗?只是为了确保我的程序问题更少?

【问题讨论】:

  • 第二种情况为 int 保留空间并让您的指针指向它。如果你当时没有记忆,你也会有问题。

标签: c malloc calloc


【解决方案1】:

malloc 用于分配内存。您可以通过使用malloc 分配指针或使其指向已分配的内存部分来使用指针。

在你展示的第一种情况下,除非你让指针指向一个地址,否则它不会被分配并且不能被使用。例如,你可以让它指向一个现有的 int 值:

int value = 0;
int* pointer;
pointer = &value;

但是你不能分配它来保存一个值:

int value = 0;
int* pointer;
*pointer = value; // wrong because pointer is not allocated

这是您的第二个案例的用途。

calloc 基本上是malloc + 初始化。

编辑:无论如何,这并不是使用 malloc 的一个很好的例子。最好的用途可能是您需要分配可变大小的数组(在编译时未知)。然后你需要使用:

int* array = (int*)malloc(N * sizeof(int));

这有两个原因:

  1. 如果 N 是变量,则不能像 int array[N]; 那样进行静态分配
  2. 堆栈可能会限制您可以分配多少空间。

【讨论】:

  • 但在第二种情况下,我可以做指针 = &value。正确的?这本质上是一样的,我的指针获取了存储值的内存地址。
  • 感谢 Tudor,但我仍然感到困惑。看来我可以做所有 malloc 的用途,只需使用 * 和 & 运算符,而无需任何动态内存分配。
  • @JJG:我添加了一个关于 malloc 的更有用的示例。
【解决方案2】:

在第一种情况下,您在堆栈上分配了一个指向整数的指针;这就是全部。所以你只有一个指针。

在第二种情况下,您在堆栈上分配了一个指向整数的指针;然后使用 malloc 分配一个足够大的内存块以容纳一个整数,并使其指向整数的指针指向该 malloc()ed 内存;所以这里你有一个指向整数的指针一个整数。

【讨论】:

  • 我会说第一种情况是一个定义,通常是一个局部变量,它恰好位于调用堆栈上处理器分配的调用帧内。 (编译器不分配它)。如果该定义是全局的,则该变量不在堆栈中。
  • @JJG 你可以。看我的例子。
  • 你可以做 int myinteger=42; int *mypointer= &myinteger; *mypointer=3; 和之后 myinteger 将包含 3。
【解决方案3】:

您应该只在需要时使用 calloc 或 malloc 分配内存(乐观地)。指针也可能指向一个现有的内存位置。

【讨论】:

    【解决方案4】:

    第一种情况:你只声明了一个变量指针。但是没有分配任何东西。这只是一个声明。

    但是第二种情况:您在堆中分配内存 1 指针(您可以在堆中创建第 n 个指针)乘以您想要的元素数。

    case 1 和 case 2 的不同之处在于 case 1 的内存会一直保留在 Stack 中,直到程序运行结束。但在情况 2 .. 您可以随时使用 free(pointer) 释放(回收)内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-02
      • 2010-12-05
      • 2020-04-08
      • 2013-11-17
      • 2020-03-22
      • 2013-06-06
      • 2018-05-28
      相关资源
      最近更新 更多