人们似乎在使用数组时会说malloc是如此之大,如果你不知道数组在编译时有多少元素(?),你可以使用它.好吧,没有malloc,你不能这样做吗?例如,如果我们知道我们有一个字符串,其最大长度为10,那么以下内容是否足够接近同一个东西?...除了能够释放内存之外.
char name[sizeof(char)*10];
Run Code Online (Sandbox Code Playgroud)
和
char *name = malloc(sizeof(char)*10);
Run Code Online (Sandbox Code Playgroud)
第一个在堆栈上创建一个字符数组.数组的长度将是sizeof(char)*10,但看起来char是由大小为1的标准定义,你可以写char name[10];
如果你想要一个数组,大到足以存储10个整数(每个标准定义为至少 2个字节的大小) ,但最常见的实现为4字节大)int my_array[10],也有效.编译器可以计算出需要多少内存,不需要编写类似的东西int foo[10*sizeof(int)].事实上,后者将是不可预测的:依赖于sizeof(int),数组将存储至少 20个整数,但可能足够大以存储40.
无论如何,后一个片段调用一个函数,malloc将尝试分配足够的内存来存储堆上有10个字符.内存未初始化,因此它将包含垃圾.
堆上的内存稍微慢一些,需要您更多关注,编写代码:您必须free明确地使用它.
再次:char保证大小为1,所以char *name = malloc(10);也会在这里做.但是,在处理堆内存时,我 - 我并不孤单 - 更喜欢像这样some_ptr = malloc(10*sizeof *some_ptr);使用分配内存*some_ptr,就像说这个指针所指向的任何类型的大小的10倍.如果您以后碰巧更改了类型,则无需重构所有malloc调用.
一般的经验法则,回答你的问题"你能否做到malloc",就是你不使用malloc,除非你必须这样做.
堆栈内存更快,更易于使用,但它不够丰富.这个站点是以一个众所周知的问题命名的,当你把太多的东西推到堆栈上时它会遇到这个问题:它溢出了.
当您运行程序时,系统将分配一块您可以自由使用的内存.这并不多,但很多简单的计算和调用函数.一旦用完,你将不得不求助于从堆中分配内存.
但在这种情况下,10个字符的数组:使用堆栈.
其他需要考虑的事项:
sizeof(an_array)/sizeof(type)vs sizeof(a_pointer))sizeof.编译器为您设计了大小:<type> my_var[10]将保留足够的内存来容纳给定类型的10个元素.realloc首选的数组.如果你在递归函数中声明这个数组,那么运行得很深,那么再次,malloc也可能是更安全的选择另外看看这个问题+答案.它解释了为什么指针不能给出你正在处理的内存块的确切大小,以及数组为什么可以.
在可能的情况下考虑支持数组的参数