malloc和数组有啥区别
Posted
技术标签:
【中文标题】malloc和数组有啥区别【英文标题】:What is the difference between malloc and arraymalloc和数组有什么区别 【发布时间】:2016-07-19 05:34:51 【问题描述】:我想问一下malloc和array。
int *x;
x = (int*)malloc(sizeof(int));
和
int x[4];
它们有什么区别?
【问题讨论】:
Difference between declaration and malloc的可能重复 【参考方案1】:int *xp;
和int xa[4];
之间最重要的区别是sizeof(xp) != sizeof(xa)
声明对象的大小。
您可以将xa
对象作为int *pparam
传递给函数,但不能将xp
作为int aparam[4]
传递给函数,因为aparam 描述了整个4 个int 对象,而pparam 描述了指向一个可以有任意长度的对象。
同样xa
将保留在链接程序的数据区,而指针malloc(sizeof(int)*4)
将在运行时和堆上由系统调用分配。在调试器中检查巨大的地址差异!
【讨论】:
啊.. 是的.. sizeof()。我忘记了。当然sizeof(xp[0]) == sizeof(xa[0])
。你也让我把它们作为参数传递给函数。点赞。【参考方案2】:
嗯,有很多不同。
这会在堆上分配一个int
的缓冲区...
int *x;
x = (int*)malloc(sizeof(int));
这会在堆栈或全局内存中分配一个由四个 int
s 组成的数组,或者如果它出现在结构或类的定义中,则可能将其声明为结构或类的成员......
int x[4];
除了分配的位置,第一个分配的空间用于一个int
,第二个分配的空间用于四个int
s。但假设你打算这样做......
int *x;
x = (int*)malloc(sizeof(int) * 4);
...那么在这种情况下,两个分配都是一块内存,其大小是您平台上int
大小的四倍。从使用的角度来看,您可以以几乎相同的方式使用它们;在任何一种情况下,x[0]
都是第一个 int
,并且由于两者都没有声明为 const
,因此您可以以相同的方式读取或写入其中任何一个。
所以现在我们来了解分配内存的两种不同方式在分配特征和生命周期方面的差异:
在malloc()
'ed 的情况下,该请求的内存是在堆上分配的,无论您希望保留它的生命周期有多长,直到您对其调用free()
为止。在另一种情况下,如果您将其声明为方法/函数内的局部变量,则它的生命周期是直到程序执行退出声明它的范围。如果你将它声明为一个全局变量,它的生命周期就是整个应用程序的生命周期。如果你将它声明为结构或类的成员变量,那么它的生命周期就是它的封闭结构/类的生命周期,无论它可能是什么。
【讨论】:
以上是关于malloc和数组有啥区别的主要内容,如果未能解决你的问题,请参考以下文章