为什么不 垃圾值 正在由该程序打印

Why not Garbage Value is being printed by this program

本文关键字:程序 打印 为什么不      更新时间:2023-10-16

下面的程序可能会打印一些垃圾数据,因为字符串存储在函数getString()的堆栈帧中,并且在getString()返回后数据可能不存在。

#include <stdio.h>
char *getString()
{
  char str[] = "abc"; 
  return str; 
}     
int main()
{
  printf("%s", getString());  
  return 0;
}

输出:垃圾值。

那么为什么下面的程序运行良好并且不打印垃圾值。

#include<stdio.h>
int *fun()
{
    int i=50;
    int *p=&i;
    return p;
}
int main()
{
    int *q=fun();
    printf("%d",*q);
    return 0;
}

输出 : 50

这里 p 也是函数 fun() 中的一个指针,存储在堆栈段中。我在这里很困惑。为什么输出是 50 而不是垃圾值?

谢谢。

它显示堆栈中的值,因为该值尚未被其他内容覆盖。如果我们用参数调用函数或创建一些堆栈变量,则打印的值将更改。下面打印 1,而不是 50,因为后者被覆盖了。

void bar(int a, int b, int c)
{
    char buf[] = "string";
    printf("%d-%d-%d-%sn", a, b, c, buf);
}
int *fun()
{
    int i=50;
    int *p=&i;
    return p;
}
int main()
{
    int *q=fun();
    bar(1, 2, 3);
    printf("%dn",*q);
    return 0;
}

未定义的行为意味着语言标准没有为调用它的程序指定任何特定的行为。程序具有未定义的行为。特定的输出/行为完全是特定于平台的,绝不可靠或有效;而且,它还包括"按预期工作"。

我没有尝试过你的代码,但我的看法是

getString()

当 getString() 返回时,"abc" 的字节仍然存储在之前的堆栈内存中。 但是,CPU 随后将准备对 printf 的调用,该调用设置一个新的堆栈帧,从而用特定于 printf 调用的数据覆盖"abc"。

乐趣

Fun 的返回值存储在 CPU 累加器寄存器中,因此对 printf 的调用永远不会触及前一个堆栈帧的内存。