gpt4 book ai didi

c - 堆栈内存是如何组织的?

转载 作者:太空狗 更新时间:2023-10-29 16:41:14 25 4
gpt4 key购买 nike

我只是想确保我做对了。想象一下我机器上任何程序的堆栈大小是800 字节(仅作为示例)。然后,下面的代码:

void f()
{
char x[300];
char y[300];
char z[300];
char t[300];
}

应该溢出堆栈吗(因为 1200>800)?

现在我的问题是,下面的方法是解决上述堆栈溢出问题的好方法?

void f()
{
f1();
f2();
}

哪里:

void f1()
{
char x[300];
char y[300];
}

void f2()
{
char z[300];
char t[300];
}

这样按照我的推理每个函数只消耗600字节(<800)堆栈内存,所以一切都应该没问题。我说得对吗?

附言。为了这个例子,我指的不是可能占用堆栈空间的“其他”数据。

页数。换句话说,是不是每次函数 f()、f1() 和 f2() 都获得它们的堆栈“实例”?

最佳答案

虽然其他人都在说“是的,它有帮助”、“不,它不会”、“没有区别”等等。我会告诉你,你的要求非常依赖于实现它不可能得到直接的普遍答案。您描述的变量是自动,这意味着它们的可见性定义受其功能范围的限制。幕后发生的事情完全平台相关。

我已经提到过一个例子,一个实现可能可能有两个函数自动变量占用内存,即完全优化调用,因此需要足够的占用内存专用于自动变量< em>全部在一个地方。 您不知道,老实说,您最好不要假设自己需要这样做,除非您正在编写嵌入式、内核或驱动程序代码,其中每个字节都很重要并且平台已成定局。

C 标准非常具体,解决此类问题,将其留给实现来完成。搜索 C99 标准,您会发现“堆栈”一词正好 次。这并非偶然。

就是说,如果您正在设计一个简单实现您自己,那么在设计中考虑您所关心的是最重要的,但除非您正在努力这条路(或你已经知道平台答案的内核/驱动程序/嵌入式小街),根本没有具体的方式说“它以这种方式工作......”你的实现可能只是按照你描述的那样做,自助餐厅众所周知的盘子堆。但这决不能用来断定所有(甚至大多数)实现都会做同样的事情。只要他们遵守有关自动变量的标准提出的规则,剩下的就是细节中的魔鬼。

关于c - 堆栈内存是如何组织的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21575418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com