在堆栈上分配大型结构是否可以?

时间:2014-05-05 12:06:54

标签: c

考虑我有以下结构:

struct BigStruct {
  char data1[999];
  char data2[999];
  ...
  char dataN[999];
}

在代码中的某处我有一个初始化类型的非静态变量:

struct BigStruct foo = 
{
 .data1 = {0},
 .data2 = {0},
 ...
 .dataN = {0},
}

看起来这里将尝试在堆栈上分配几KB的内存。我是对的吗?

没关系,还是一种不好的做法?

3 个答案:

答案 0 :(得分:0)

使用自动存储没有任何问题。

如果结构对于您的平台来说太大,您的程序可能会崩溃。

在Linux系统上,您可以使用ulimit -sulimit -a

查看最大堆栈大小

答案 1 :(得分:0)

这取决于您的软件架构和目标。

如果您正在编写内核代码,那么您不想使用大量的堆栈空间; Linux kernel stacks are small

用户程序通常有1 Mb或更大的堆栈,所以除非你有很多递归例程,否则在堆栈上分配几个kB通常不是问题。

在Linux中,您可以使用ulimit -s检查堆栈大小。结果是在KiB。

答案 2 :(得分:0)

回到内存堆栈的时代(并且是)在调用函数之前保存寄存器内容(和传递参数)的方法(实际上,即使在今天,许多微控制器都是这样工作的)。滥用这样的概念是不可移植的! (你可以找到程序崩溃的一些架构)