堆栈(内存段)是否总是连续保存变量?

Paz*_*Paz 1 c memory-management

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

int a = 1;
int b = 5;
int *p = &a;
Run Code Online (Sandbox Code Playgroud)

将:

int k = *(p+1);
Run Code Online (Sandbox Code Playgroud)

总是给k = 5


形式上:

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

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

Eli*_*gem 6

不...... 虽然它可能会出现在大多数平台上但绝对不能保证你的代码会产生5.你所拥有的是未定义的行为,这可能会导致程序崩溃.永远不要依赖未定义的行为,完全停止.

  • "虽然它可能会出现在大多数平台上"......我不这么认为.通常,`b`甚至不会被放在堆栈中,而只是被放在一个寄存器中 - 取决于它的用法. (2认同)
  • 在更复杂的函数(寄存器用完)中,变量的生命周期通常不会重叠,因此两个变量可以共享同一个地址. (2认同)