【发布时间】:2011-03-06 15:10:44
【问题描述】:
我认为这可能是一个非常愚蠢的问题,但我只想澄清一下。提前致谢!我不确定在函数内部声明为局部变量的结构数组是否在堆栈中分配。不是吗?
【问题讨论】:
我认为这可能是一个非常愚蠢的问题,但我只想澄清一下。提前致谢!我不确定在函数内部声明为局部变量的结构数组是否在堆栈中分配。不是吗?
【问题讨论】:
确实如此;您声明的任何内容(例如通过调用malloc)或声明为静态(如Fernando says)都在堆栈上分配。结构只是将多个变量组合在一起的一种方式;他们仍然有一个固定的大小(他们元素的总大小,可能加上一些填充),并且访问结构的字段只是意味着从结构中的某个地方提取适当的字节
【讨论】:
除非您使用 malloc() (如@Michael Mrozek 所说)或使用“静态”修饰符声明它,否则它会在堆栈中分配。
【讨论】:
是的,在函数范围内声明为自动变量的数组将从堆栈中分配。这样做时你要谨慎,因为你永远无法从调用上下文中确定是否有足够的堆栈空间来成功。即使 Windows 默认为线程创建 1MB 堆栈,Linux 默认创建 8MB 堆栈,但如果您创建大型结构数组,您仍然会遇到问题。在某些操作系统中,线程堆栈可能只有几 kB。
我倾向于将函数范围自动变量限制为简单的标量类型,并将大型抽象类型和数组放在堆上。
【讨论】:
就像其他变量一样:
void function()
{
struct my_struct a; // in the stack;
struct my_struct *b = malloc(sizeof(struct my_strcut)); // not in the stack;
static struct my_struct c; // not in the stack;
}
【讨论】: