可能重复:
malloc的或正常的阵列定义的?
我们了解到,当C和动态变量的动态内存:
#include <stdio.h>
int a = 17;
int main(void)
{
int b = 18; //automatic stack memory
int * c;
c = malloc( sizeof( int ) ); //dynamic heap memory
*c = 19;
printf("a = %d at address %x\n", a, &a);
printf("b = %d at address %x\n", b, &b);
printf("c = %d at address %x\n", *c, c);
free(c);
system("PAUSE");
return 0;
}
我怎么知道使用哪种类型的内存? 当我定义一个或其他?
您可以使用动态内存时,你分配的大小是事先只在运行时不知道。
例如你问一个用户输入名称(可以说多达10名),并将其存储在一个字符串数组。 因为你不知道用户将有多少名提供(仅在运行时是)你必须分配你知道后,才多少来分配,所以你将使用动态分配的数组。
当然,你可以使用的固定大小10的阵列,但对于更大的量,这将是浪费的
如果你可以不动态分配程序不使用它!
但一天你会被阻塞,疏通你会使用动态分配那么现在你可以使用它的唯一途径
使用动态内存分配,如果你不知道你的程序究竟需要多少内存在编译时分配。
int a[n]
,例如将限制您的阵列大小为n。 另外,无论你使用它,或者不是分配NX 4个字节的内存。 这被分配在堆栈上,并且将变量n 必须在编译时是已知的。
int *a = (int *)malloc(n * sizeof (int))
,另一方面在运行时分配的,在堆上,和n
只需要在运行时是已知的,不必在编译时。
这也确保你确切地分配尽可能多的内存,你真正需要的。 然而,当你在运行时分配它,清理,要由你使用来实现free
。
你应该使用动态内存时:
- 如果你希望你的对象持续超过其所创建的范围。
- 通常情况下,堆栈大小是有限的,因此,如果你的对象占用了大量的内存,那么你可能在这种情况下,人们通常会去动态分配内存用完的堆栈空间。
需要注意的是C99标准引入了可变长度阵列(VLA)用C,所以你不需要使用动态内存分配,只是因为你不知道前手的阵列尺寸(除非ofcourse #2
上面提到的就是这种情况)
最好是避免动态内存分配尽可能多的,你可以,因为这意味着明确地管理内存而不是由language.Explicit内存管理提供的自动机制意味着你很容易让更多的错误,这可能会导致灾难性的影响。
话虽如此动态存储器分配不能总是避免并且必须使用时的使用是必要的(2箱子如上所述)。
阿尔斯提出一个有趣的问题,你应该从堆中,如果你的对象需要持续超过在其中创建范围分配内存。 在上面的代码,你并不需要在所有从堆中分配内存。 你可以把它改写如下:
#include <stdio.h>
int a = 17;
int main(void)
{
int b = 18; //automatic stack memory
int c[1]; // allocating stack memory. sizeof(int) * 1
c[0] = 19;
printf("a = %d at address %x\n", a, &a);
printf("b = %d at address %x\n", b, &b);
printf("c = %d at address %x\n", c[0], c);
system("PAUSE");
return 0;
}
事实上,如C99标准(的一部分变长数组 ),则可以使用[]
操作者分配动态空间堆栈上的阵列就像通常会做来创建阵列。 你甚至都不需要知道在编译时数组的大小。 编译器将只调整ESP寄存器(用于x86
基础上,要求分配空间的机器),你是好去。