malloc和array之间有什么区别

时间:2016-03-31 00:08:24

标签: arrays malloc

我想问一下malloc和array。

int * x;

x =(int *)malloc(sizeof(int));

int x [4];

他们之间有什么区别?

2 个答案:

答案 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()。在另一种情况下,如果您在方法/函数中将其声明为局部变量,则其生命周期将一直持续到程序执行退出声明它的范围。如果您将其声明为全局变量,则其生命周期是整个应用程序的生命周期。如果你将它声明为结构或类的成员变量,那么它的生命周期就是它的封闭结构/类的生命周期,无论它是什么。