如何通过malloc生成的数组与不生成的数组不同

时间:2014-10-27 04:27:40

标签: c memory-management malloc

我不太了解malloc,那些是在堆上创建的malloc创建的吗?

5 个答案:

答案 0 :(得分:3)

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

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

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

与堆栈分配相比,另一个优点是,当我们说你没有足够的可用内存时,你可以检查malloc是否失败。

附注:不要忘记freemalloc的内容。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

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

答案 3 :(得分:0)

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

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

这里,ptr是cast-type的指针。 malloc()函数返回一个指向内存区域的指针,其大小为字节大小。如果空间不足,分配将失败并返回NULL指针。

实施例

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

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

答案 4 :(得分:0)

您的问题是"通过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返回归零的内存并且随后返回的块被适当地对齐。