我正在研究的malloc示例是
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *vec;
int i, size;
printf("Give size of vector: ");
scanf("%d",&size);
vec = (int *) malloc(size * sizeof(int));
for(i=0; i<size; i++) vec[i] = i;
for(i=0; i<size; i++)
printf("vec[%d]: %d\n", i, vec[i]);
free(vec);
}
但是我可以让程序在运行时运行,就像这个程序在C语言中编写它而不是malloc,不是吗?那么malloc在这里的用途是什么?
答案 0 :(得分:4)
是动态内存分配。
非常重要的一点是你不知道你需要多少内存,因为你必须最终得到的内存量取决于用户输入。
因此,在编译时使用带有size
作为其参数的一部分的malloc和size
是未知的。
答案 1 :(得分:2)
此特定示例可以使用variable length arrays完成,自c99
以来标准支持,现在是2011标准的可选项。虽然如果size
非常大,在堆栈上分配它将无法工作,因为堆栈比可用堆内存小得多,这是malloc
将使用的内存。我的这个previous post也有一些你可能会觉得有用的可变长度数组的链接。
在dynamic data structures使用malloc
时使用{{1}}的示例之外很难避免。
答案 2 :(得分:1)
两个问题:
首先,您可能不知道在运行时需要多少内存。使用malloc()
可以让您准确分配合适的金额:不多也不少。如果没有足够的内存,你的应用程序可以优雅地“降级”。
其次,malloc()
从堆中分配内存。这有时可能是一个优势。在堆栈上分配的局部变量具有非常有限的总内存量。静态变量意味着您的应用程序将始终使用所有内存,如果内存不足,甚至可能会阻止您的应用加载。