我试图从上一个堆栈访问变量,这在Linux中给了我以下错误:
.... terminated by signal SIGSEGV (Address boundary error
然而,在2014年的CS61C演讲中,输出为:
3
Something Random
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);
}
答案 0 :(得分:2)
这些讲义更多地是关于对特定编译器的行为的研究,而不是其他任何事情:从语言的角度来看,图中的断言“ C中的指针允许访问释放的内存”是不正确的;行为只是C标准的 undefined 。
因此,您最好的选择是检查生成的组件。在语言级别上,这是无法回答的,因为该语言并未定义行为。
答案 1 :(得分:1)
您的假设并不完全正确:
如果printf没有将该插槽用于其他用途,那么该行为应该第二次发生吗?
否。
对于第一次调用,在调用printf
之前完成了非法内存访问,因为在调用函数之前必须先评估参数。对于第二次调用,该表达式再次被求值,并且在此期间可能发生任何事情。
如果您调用UB,就会发生这种情况。