c++ - 为什么这个程序不打印垃圾值

标签 c++ c garbage-collection

<分区>

下面的程序可能会打印一些垃圾数据,因为字符串存储在函数 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-%s\n", a, b, c, buf);
}

int *fun()
{
    int i=50;
    int *p=&i;
    return p;
}

int main()
{
    int *q=fun();
    bar(1, 2, 3);
    printf("%d\n",*q);
    return 0;
}

关于c++ - 为什么这个程序不打印垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41779263/

相关文章:

python - 判断对象是否已经完成

C++17:元组解包时只保留一些成员

glibc 中的更改不起作用

c++ - 在 64 位 open suse linux 上构建 32 exe 出现链接错误

c - Redland RDF 库 : why does parsing model from Turtle without base URI cause error?

使用预处理器的 C 多个函数定义

python:是什么阻止了对象的破坏?

c# - 我如何调查终结队列和终结幸存者

c++ - 高效稳定的有序数之和

c++ - 具有两个参数之一作为 constexpr 的内联函数