我想问一下malloc和数组。
int*x;
x=(int*)malloc(sizeof(int));
和
int x[4];
它们之间有什么区别?
int *xp;
和int xa[4];
之间最重要的区别是sizeof(xp) != sizeof(xa)
声明对象的大小。
可以将xa
对象作为int *pparam
传递给函数,但不能将xp
作为int aparam[4]
传递给函数。因为aparam描述了整个4int对象,而pparam描述了指向可能具有任何长度的对象的指针。
此外,xa
将保留在链接程序的数据区域中,而指针malloc(sizeof(int)*4)
将由运行时和堆上的系统调用分配。在调试器中检查巨大的地址差异!
嗯,有多种不同。
这会在堆上分配一个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()
。在另一种情况下,如果你在方法/函数中将它声明为局部变量,它的生活期是直到程序执行退出声明它的范围。如果您将它声明为全局变量,那么它的生存期就是整个应用程序的生存期。如果你把它声明为结构或类的成员变量,那么它的生存期就是它的封闭结构/类的生存期,不管它是什么