【问题标题】:In C, does an array of a structure gets allocated in the stack?在 C 中,结构的数组是否在堆栈中分配?
【发布时间】:2011-03-06 15:10:44
【问题描述】:

我认为这可能是一个非常愚蠢的问题,但我只想澄清一下。提前致谢!我不确定在函数内部声明为局部变量的结构数组是否在堆栈中分配。不是吗?

【问题讨论】:

    标签: c struct stack


    【解决方案1】:

    确实如此;您声明的任何内容(例如通过调用malloc)或声明为静态(如Fernando says)都在堆栈上分配。结构只是将多个变量组合在一起的一种方式;他们仍然有一个固定的大小(他们元素的总大小,可能加上一些填充),并且访问结构的字段只是意味着从结构中的某个地方提取适当的字节

    【讨论】:

    • @Stephen 啊,是的。我有一个坏习惯,在阅读时会自动将“In C”翻译成“In C or C++, your choice”
    • 栈和堆是实现细节不是吗?我什至不确定 C 标准是否提到了“堆栈”这个词。
    • @Phong 我不知道你指的是什么全局变量;他说“在函数内声明为局部变量”
    • 另外值得注意的是你可以在栈上显式分配一些东西;参考文献分配。
    • 你忘了静态分配。全局范围内的变量和带有“static”限定符的变量。
    【解决方案2】:

    除非您使用 malloc() (如@Michael Mrozek 所说)或使用“静态”修饰符声明它,否则它会在堆栈中分配。

    【讨论】:

      【解决方案3】:

      是的,在函数范围内声明为自动变量的数组将从堆栈中分配。这样做时你要谨慎,因为你永远无法从调用上下文中确定是否有足够的堆栈空间来成功。即使 Windows 默认为线程创建 1MB 堆栈,Linux 默认创建 8MB 堆栈,但如果您创建大型结构数组,您仍然会遇到问题。在某些操作系统中,线程堆栈可能只有几 kB。

      我倾向于将函数范围自动变量限制为简单的标量类型,并将大型抽象类型和数组放在堆上。

      【讨论】:

        【解决方案4】:

        就像其他变量一样:

        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;
        
        }
        

        【讨论】: