我试图理解我的头脑。通过K& R阅读,我来回试图找到它说明我应该动态获取内存块的情况。
例如,我想要一个int指针。
int *pointer;
但是K& R表示我可能会这样做:
int *pointer;
pointer = (int*)malloc(sizeof(int));
基本上,我在这里做了哪些不同的事情?在第一种情况下,我创建了一个指针,它还没有指向任何东西,所以我想如果计算机内存不足,我试着将它指向一个int值,我会遇到问题。第二种情况为我的指针保留了空间。所以我不必担心我的程序有多少内存问题。它是否正确? 如果这是正确的,我不应该为我创建的每个指针使用malloc(或calloc)吗?只是为了确保我的程序有更少的问题?
答案 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));
这有两个原因:
int array[N];
答案 1 :(得分:3)
在第一种情况下,您在堆栈上分配了一个指向整数的指针;那是所有。所以你有一个指针。
在第二种情况下,您在堆栈上分配了一个指向整数的指针;然后使用malloc来分配一个足够大的内存块来保存一个整数,并使你的指针指向整个指向malloc()ed内存的指针;所以这里有一个指向整数和整数的指针。
答案 2 :(得分:0)
只有在需要使用calloc或malloc时才应该分配内存(乐观)。指针也可以指向现有的内存位置。
答案 3 :(得分:0)
第一种情况:您只声明1个变量指针。但没有分配任何东西。这只是一个宣言。
但是第二种情况:你在堆中分配内存1指针(你可以在堆中创建指针的第n个)乘以你想要的元素数。
案例1和案例2之间的区别在于,在案例1中,内存将保留在堆栈中,直到程序完成运行。但是在情况2 ..你可以通过使用free(指针)随时释放(回收)内存。