了解malloc和calloc的目的

4 c malloc calloc

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

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

int *pointer;
Run Code Online (Sandbox Code Playgroud)

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

int *pointer;

pointer = (int*)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

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

Tud*_*dor 7

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

在您显示的第一种情况下,除非您将指针指向某个地址,否则它不会被分配且无法使用.例如,您可以指向一个退出的int值:

int value = 0;
int* pointer;
pointer = &value;
Run Code Online (Sandbox Code Playgroud)

但是你不能指定它来保存一个值:

int value = 0;
int* pointer;
*pointer = value; // wrong because pointer is not allocated
Run Code Online (Sandbox Code Playgroud)

这是你的第二个案例.

calloc基本上是malloc+初始化.

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

int* array = (int*)malloc(N * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

这有两个原因:

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