【问题标题】:Does the stack (memory segment) always save variables continuously?堆栈(内存段)是否总是连续保存变量?
【发布时间】:2014-02-17 23:51:30
【问题描述】:

假设我正在编写一个 C 程序,它具有:

int a = 1;
int b = 5;
int *p = &a;

意志:

int k = *(p+1);

总是给k = 5


正式地:

栈上变量地址的这个“连续”属性是否依赖于实现?如果没有,是否有任何保证(例如&a < &b < &p)?

(这个在 ubuntu 上使用 gcc 的简单测试给出了k=5,但是其他涉及不同类型的测试不起作用)

【问题讨论】:

  • 如果想要连续内存,使用数组分配
  • 我只是想获得更多关于堆栈段的信息。不过还是谢谢。

标签: c memory-management


【解决方案1】:

不... 虽然它可能会在大多数平台上绝对不能保证您的代码会产生 5。您所拥有的是未定义的行为,这可能会导致你的程序卡住了。永远不要依赖未定义的行为,句号。

【讨论】:

  • “虽然它可能会在大多数平台上”......我不这么认为。通常,b 甚至不会被放入堆栈,而只是保存在一个寄存器中 - 取决于它的用法。
  • @glglgl:公平点...将编辑我的答案。刚刚在我的系统上尝试了这段代码,也得到了 5 个(slackware)
  • 对于更复杂的函数(寄存器用完),变量的生命周期通常不会重叠,因此两个变量可以共享同一个地址。
  • @EliasVanOotegem ...取决于优化级别。使用-O0,您可能会得到该结果,使用其他级别,如果未使用,b 可能会被优化掉。
  • 堆栈对齐是这种未定义行为完全不可靠的另一个例子:stackoverflow.com/questions/672461/what-is-stack-alignment
猜你喜欢
  • 2015-09-16
  • 2011-07-02
  • 2023-04-08
  • 2019-01-15
  • 2010-10-22
  • 2019-09-12
  • 2015-04-18
  • 1970-01-01
相关资源
最近更新 更多