在内部作用域中声明的变量通过指针访问是否安全?

3
下面的程序输出:
root 3                                                                                                                                                        
next 11

然而,我不确定该程序是否一直保留root.next直到程序结束。
#include<stdio.h>

typedef struct sequence
{
    int x;
    sequence* next;
}sequence;

int main()
{

   sequence root;
   root.x = 3;
   {
       sequence p;
       p.x = 11;
       root.next = &p;
   }

   printf("root %d\n",root.x);
   printf("next %d\n",root.next->x);
   return 0;
}
1个回答

3

p标记的范围在闭合括号处结束。

{
    sequence p;
    p.x = 11;
    root.next = &p;
} <---- here

当您调用printf("next %d\n",root.next->x);时,您使用root.next指向的变量p已经不存在了。因此它是不“安全”的,因为它会导致未定义的行为。


那么这是否意味着“printf”仅打印正确的结果是因为地址中的值没有被覆盖? - ergoilto
@ergoilto 看一下生成的汇编代码。就 C 语言而言,它是未定义的。 - reader
“未定义行为”可以意味着任何事情,包括你所希望的事情。永远不要指望它,下一次它可能会引发核战争。 - sp2danny
@ergoilto 非学究式的回答是肯定的。 - Praxeolitic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接