2014-10-27 31 views

回答

3

是的,当你malloc你在堆中分配。

malloc函数从堆中请求一块内存。如果请求被授予,操作系统将保留请求的请求的内存量。

如果数据的生命周期必须与分配的代码范围不同,那么您应该使用malloc。例如:你在一个函数中使用malloc,你存储/保存一个指向该分配空间的指针,然后你可以在另一个函数中使用它。

与堆栈分配相比,另一个优势是您可以检查malloc是否失败,假设您没有足够的可用内存。

附注:不要忘了freemalloc

+2

“是的,当你在malloc中分配堆时。” - 至少在使用堆实现动态内存分配系统时。它可能不是(例如在AVR微控制器上,它不是)。使用正确的措辞(“动态分配”)不会更困难时,使用不精确的,与实施细节相关的术语毫无意义。 – 2014-10-27 05:35:44

0

分配请求的字节大小,并返回分配的空间的指针的第一个字节

ptr=(cast-type*)malloc(byte-size) 

这里,PTR是铸型的指针。 malloc()函数返回一个指向字节大小的内存区域的指针。如果空间不足,分配失败并返回NULL指针。

ptr=(int*)malloc(100*sizeof(int)); 

时,要动态分配的内存(在运行时)时使用。通常每个程序在运行时都与堆内存相关联。因此,当使用free()完成内存使用时,应该将其返回。

+0

http://meta.stackoverflow.com/questions/273024/position-fixed-navigation-bar – Mat 2014-10-27 04:48:49

+2

[铸造标准分配器的返回值是有害的。](http://stackoverflow.com/questions/605845/do- i-cast-of-malloc) – 2014-10-27 05:34:02

2

另一个区别(在其他答案中还没有提到)是由malloc()创建的数组是匿名的 - 您有一个指向数据的指针,但没有数据的名称。

2

堆栈和堆中的数组在使用方面没有区别。两者都是记忆 - 它们在分配方面不同。 malloc内部调用brk()sbrk()来改变“程序中断”,即程序地址空间根据您的malloced大小要求。

当您不完全知道要分配多少内存时使用malloc。或者如果您需要重新使用内存,因为一次只使用一个或两个时,不能分配1000个大小为10的数组。然后去malloc,因为你完成后可以释放内存。

注意:永远不要尝试free()静态分配的变量!

+2

欢迎来到StackOverflow。但根据[Rhythm'n'Grammar](http://www.hrwiki.org/wiki/local_news#Easter_Eggs):*“我们不在乎他们如何在互联网上拼写东西,当你回答SO时,你[拼出整个单词](http://stackoverflow.com/revisions/26581453/1)。我们不关心你的手机里有一个摄像头。“*。饭桶。 :-) – HostileFork 2014-10-27 06:43:51

+2

当然,下次还会继续。 :) – 2014-10-27 07:22:26

0

你的问题是“通过malloc生成的数组与通过malloc生成的数组不同吗?”

答案:就C语言而言,没有区别。 C获取数组地址并进行相对于它的索引,因此数组是否在堆中分配或静态声明并不重要。

int a[10]; 
int *aa; 
int *b; 

b= a; 
b[3]= 4; 

aa= calloc(10, sizeof(int)); 
b= aa; 
b[3]= 4;  

注意:malloc返回非零内存; calloc返回归零内存并确保返回的块适当对齐。

相关问题