检查在C中成功创建的数组

检查在C中成功创建的数组,c,arrays,memory,C,Arrays,Memory,在C中,有两种创建数组的方法: int array[100]; 及 int * array = malloc(sizeof(int)*100); 使用第二条语句可以轻松检查是否有足够的内存可用于创建数组,例如: if(array == NULL){ goto OutOfMemory; } 但是,您如何检查第一种方法是否成功?假设这是在微控制器上运行,而不是在计算机上运行 在堆栈上分配数组时不存在可恢复的故障(第一种方法)。只有当分配它导致堆栈溢出时,它才会失败,此时您的程序已经中

在C中,有两种创建数组的方法:

int array[100]; 

int * array = malloc(sizeof(int)*100); 
使用第二条语句可以轻松检查是否有足够的内存可用于创建数组,例如:

if(array == NULL){
   goto OutOfMemory;
}

但是,您如何检查第一种方法是否成功?假设这是在微控制器上运行,而不是在计算机上运行

在堆栈上分配数组时不存在可恢复的故障(第一种方法)。只有当分配它导致堆栈溢出时,它才会失败,此时您的程序已经中止/终止

当您以第一种方式分配数组时,通常是在函数调用时在堆栈上分配数组。如果堆栈上没有足够的空间分配它,程序将中止,并出现堆栈溢出/segfault错误

当您以第二种方式分配内存时,您实际上是在调用malloc时向内存管理器请求堆上的内存


编辑:正如@Deduplicator所提到的,如果您在一个没有内存保护的系统上,没有足够的可用堆栈空间来分配阵列,可能会导致溢出和更微妙的问题(尽管很可能很快就会在非法指令上失败)

第一段代码将数组存储在
堆栈中
第二个将数组存储在
堆中

堆栈内存是在整个线程中预先分配的,也就是说,除非在堆栈上分配大量数据,否则通常不应该担心堆栈空间

编辑:
在这种情况下,您应该提前确保您有足够的堆栈(在IDE/编译器/链接器/专有软件中定义)在整个代码执行过程中进行调用。这可以在编译时提前知道,不需要运行时检查。

不保证没有内存保护/MMU的系统不会出现堆栈溢出。这些更有趣。@deplicator:Edited。如果你真的运气不好,你最终会用(技术上)有效的指令覆盖可执行内存。我不希望这种情况发生在机器人控制系统上……为什么没有人喜欢天网?@Deduplicator:你没听到这个消息吗?天网在商标诉讼后被重新命名为OneNet。即使是killer AI也要遵守商标法:)。如果你考虑到编辑源代码以减少所需的堆栈大小、重新编译和重新运行程序,那么第一种方法是“可恢复的”。更多信息:
stack
heap
都是编程术语。在C中,术语是
自动存储
免费存储
。使用堆数据结构不需要空闲存储,使用堆栈数据结构也不需要自动存储。