C 向量赋值:静态与动态

C 向量赋值:静态与动态,c,arrays,allocation,C,Arrays,Allocation,我在这里写一些C代码,遇到了一个问题: 我有一个自定义类型的数组。我想为这个数组设置一个大小: typedef struct reg Reg; Reg myArray[958279]; 当我运行程序时,我的程序有一个分段错误 然后我尝试使用malloc,它动态分配存储空间,令我惊讶的是,它居然奏效了: Reg *myArray = (Reg*)malloc(sizeof(Reg)*958279); 所以我假设静态表单的数组声明必须有一些大小限制 在什么地方提到过这个事实吗?还是我的问题完全错

我在这里写一些C代码,遇到了一个问题:

我有一个自定义类型的数组。我想为这个数组设置一个大小:

typedef struct reg Reg;
Reg myArray[958279];
当我运行程序时,我的程序有一个分段错误

然后我尝试使用malloc,它动态分配存储空间,令我惊讶的是,它居然奏效了:

Reg *myArray = (Reg*)malloc(sizeof(Reg)*958279);
所以我假设静态表单的数组声明必须有一些大小限制


在什么地方提到过这个事实吗?还是我的问题完全错了?

您的第一段代码中的数组可能是在堆栈上分配的,不适合。堆栈通常具有固定的大小,并且不能在堆栈上分配巨大的对象。正如您所发现的,解决方案是从堆中进行分配

第一个是堆栈分配,第二个是堆分配。堆栈分配非常快,但是每个线程的堆栈大小是有限的(在我的系统上是8MB,但我看到它只有512KB)。你知道在C语言的文档中有没有提到这一点吗?@JamesMcLaughlin:你怎么知道的?就我所知,第一个可能是静态分配…:-)@KerrekSB和像你这样的聪明人是我发表评论而不是回答的原因你知道在C语言的文档中有没有提到过这一点吗?C标准没有提到这一点。例如,一致性C实现不需要提供最小数量的堆栈空间。系统的这一部分始终是特定于实现的。在大多数系统上,为线程分配/保留的堆栈数量可以由程序/编译器控制。但是不要认为让你的堆栈变得巨大是个好主意。那以后可能会回来咬你。通常情况下,坚持系统默认堆栈大小是很有意义的。或者,您可以为阵列提供静态存储持续时间(=使其成为全局存储),这可能会更快。@kerrek为什么会更快?进程生命周期内的单个分配不太可能主导性能。通常语义决定存储决策。@DavidHeffernan:dependens。如果OP在循环中使用构造,他可能会重复分配空间。这只是一个想法。此外,静态存储为您提供了更好的保证,您可以实际获得空间(否则在加载时会失败)。