6

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

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

int *pointer;

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

int *pointer;

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

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

4

4 回答 4

9

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. 堆栈可能会限制您可以分配多少空间。
于 2011-12-11T14:34:54.330 回答
3

在第一种情况下,您在堆栈上分配了一个指向整数的指针;仅此而已。所以你有一个指针。

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

于 2011-12-11T14:32:25.293 回答
0

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

于 2011-12-11T14:35:08.620 回答
0

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

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

案例 1 和案例 2 的不同之处在于,案例 1 中的内存将保留在堆栈中,直到程序完成运行。但在情况2 ..您可以随时使用free(指针)释放(回收)内存。

于 2014-12-08T04:20:53.497 回答