2016-03-31 44 views
0

我想问一下malloc和数组。malloc和数组有什么区别

int * x;

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

and

int x [4];

他们有什么区别?

+1

[声明和malloc之间的区别]可能的重复(http://stackoverflow.com/questions/10575544/difference-between-declaration-and-malloc) – Paulpro

回答

0

好吧,有很多不同之处。

此分配在堆上一个int的缓冲器...

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

而这种分配无论是在叠或全局存储器四个int秒的阵列,或者声明为成员结构或类,如果它出现一个结构或类的定义中......

int x[4]; 

除了分配的位置,一个int第一分配的空间和分配的第二空间为四个int s。但假设你的意思是要做到这一点,而不是...

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

...那么在这种情况下,无论是分配的内存,你的平台上的int的四倍块。从使用的角度来看,您可以以几乎相同的方式使用它们; x[0]在任何一种情况下都是第一个int,既然它们都没有被宣布为const,您可以用相同的方式读取或写入。

所以现在我们得到的分配特性的差异&的分配内存的两种不同的方式寿命:

malloc()“版的情况下,内存,以便请求在堆上分配,而其一辈子不管你想保留多久,直到你拨打free()就可以了。在另一种情况下,如果您将其声明为方法/函数内的局部变量,则其生命周期将一直存在,直到程序执行退出其声明的范围。如果您将其声明为全局变量,则其生命周期是整个应用程序的生命周期。如果你将它声明为结构体或类的成员变量,那么它的生命周期就是它的封闭结构体/类,无论它是什么。

1

int *xp;int xa[4];之间最重要的差异是sizeof(xp) != sizeof(xa)声明对象的大小。

您可以将xa对象int *pparam传递给一个函数,但你不能传递xpint aparam[4]的功能,如aparam描述了整个4 int对象和pparam描述了一个指向的对象可能具有任何长度。

另外xa将被保留在链接的程序的数据区中,而指针malloc(sizeof(int)*4)将在运行时和堆上由系统调用分配。在调试器中检查巨大的地址差异!

+0

啊..是的.. sizeof()。我忘记了这一点。当然'sizeof(xp [0])== sizeof(xa [0])''。你也让我把它们作为参数传递给一个函数。给予好评。 – phonetagger