这些数组声明在C中的区别是什么?

Rob*_*b L 1 c arrays malloc

人们似乎在使用数组时会说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)

Eli*_*gem 7

第一个在堆栈上创建一个字符数组.数组的长度将是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也可能是更安全的选择

检查此链接有关数组和指针之间的差异

另外看看这个问题+答案.它解释了为什么指针不能给出你正在处理的内存块的确切大小,以及数组为什么可以.
在可能的情况下考虑支持数组的参数