访问上一个堆栈变量时会发生什么?

时间:2019-01-23 10:32:14

标签: c stack

我试图从上一个堆栈访问变量,这在Linux中给了我以下错误:

.... terminated by signal SIGSEGV (Address boundary error

然而,在2014年的CS61C演讲中,输出为:

3
Something Random

enter image description here

  1. 与我的Linux相比,它在那台机器上如何工作?
  2. 为什么它在{strong>第一次时间而不是第二时间打印3?如果printf没有将该插槽用于其他用途,那么行为也应该第二次发生吗?

下面是代码:

#include<stdio.h>

int *ptr() {
    int y;
    y = 3;
    return &y;
}

main() {
    int *stackAddr, content;
    stackAddr = ptr();
    content = *stackAddr;
    printf("%d", content);
    content = *stackAddr;
    printf("%d", content);
}

2 个答案:

答案 0 :(得分:2)

这些讲义更多地是关于对特定编译器的行为的研究,而不是其他任何事情:从语言的角度来看,图中的断言“ C中的指针允许访问释放的内存”是不正确的;行为只是C标准的 undefined

因此,您最好的选择是检查生成的组件。在语言级别上,这是无法回答的,因为该语言并未定义行为。

答案 1 :(得分:1)

您的假设并不完全正确:

  

如果printf没有将该插槽用于其他用途,那么该行为应该第二次发生吗?

否。

对于第一次调用,在调用printf之前完成了非法内存访问,因为在调用函数之前必须先评估参数。对于第二次调用,该表达式再次被求值,并且在此期间可能发生任何事情。

如果您调用UB,就会发生这种情况。