我想问一下malloc和array。
int * x;
x =(int *)malloc(sizeof(int));
和
int x [4];
他们之间有什么区别?
答案 0 :(得分:1)
int *xp;
和int xa[4];
之间最重要的区别是sizeof(xp) != sizeof(xa)
声明对象的大小。
您可以将xa
对象作为int *pparam
传递给函数,但不能将xp
作为int aparam[4]
传递给函数,因为aparam描述了整个4 int object和pparam描述了一个指向可能具有任何长度的对象的指针。
同样xa
将保留在链接程序的数据区域中,而指针malloc(sizeof(int)*4)
将在运行时和堆上由系统调用分配。检查调试器中的大量地址差异!
答案 1 :(得分:0)
嗯,有很多不同之处。
这会在堆上分配一个int
的缓冲区...
int *x;
x = (int*)malloc(sizeof(int));
这将在堆栈或全局内存中分配一个包含四个int
的数组,或者如果它出现在结构或类的定义中,则可能将其声明为结构或类的成员。 ..
int x[4];
除了分配的位置,一个int
的第一个分配空间和四个int
的第二个分配空间。但假设你打算这样做......
int *x;
x = (int*)malloc(sizeof(int) * 4);
...那么在这种情况下,两个分配都是一块内存块,其大小是平台上int
的四倍。从使用角度来看,您可以以几乎相同的方式使用它们;在任何一种情况下,x[0]
都是第一个int
,因为两者都没有被声明为const
,所以您可以以相同的方式读取或写入。
所以现在我们得出了分配特征和差异的区别。分配内存的两种不同方式的生命周期:
在malloc()
' ed情况下,该请求的内存在堆上分配,但是它的生命周期很长,您希望保留它直到您在其上调用free()
。在另一种情况下,如果您在方法/函数中将其声明为局部变量,则其生命周期将一直持续到程序执行退出声明它的范围。如果您将其声明为全局变量,则其生命周期是整个应用程序的生命周期。如果你将它声明为结构或类的成员变量,那么它的生命周期就是它的封闭结构/类的生命周期,无论它是什么。