我认为这可能是一个非常愚蠢的问题,但我只是想澄清一下。提前致谢!我不确定在函数内声明为局部变量的结构数组是否在堆栈中分配。不?
答案 0 :(得分:7)
确实如此;您在没有自行分配的情况下声明的任何内容(例如通过调用malloc
)或声明静态(如Fernando says)都会在堆栈上分配。结构只是将多个变量组合在一起的一种方式;它们仍然具有固定的大小(它们的元素的总大小,可能加上一些填充),并且访问struct的字段只意味着从结构中的某处拉出适当的字节
答案 1 :(得分:1)
是的,将在函数作用域中声明为自动变量的数组将从堆栈中分配。在这样做时你想要明智,因为如果有足够的堆栈空间来成功,你永远无法从调用上下文中确定。尽管默认情况下Windows为线程创建了1MB堆栈,而Linux默认情况下会创建8MB堆栈,但如果创建大型结构数组,仍然会遇到问题。在某些操作系统中,线程堆栈可能只有几KB。
我倾向于将函数作用域自动变量限制为简单的标量类型,并将大型抽象类型和数组放在堆上。
答案 2 :(得分:1)
除非您使用malloc()(如@Michael Mrozek所说)或使用“static”修饰符声明它,否则它将在堆栈中分配。
答案 3 :(得分:0)
就像其他变量一样:
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;
}