了解malloc和calloc的目的

时间:2011-12-11 14:29:09

标签: c malloc calloc

我试图理解我的头脑。通过K& R阅读,我来回试图找到它说明我应该动态获取内存块的情况。

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

int *pointer;

但是K& R表示我可能会这样做:

int *pointer;

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

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

4 个答案:

答案 0 :(得分:7)

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. 堆栈可能会限制您可以分配多少空间。

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

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