为什么不 垃圾值 正在由该程序打印
Why not Garbage Value is being printed by this program
下面的程序可能会打印一些垃圾数据,因为字符串存储在函数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 的调用永远不会触及前一个堆栈帧的内存。
相关文章:
- 程序打印 % 后预期输出
- C++ 链表程序打印最后一个数据项 n 次
- 合并数组的程序打印 0 而不是实际合并的数组
- 我的程序打印出与预期不同的结果
- 当矢量有 6 个元素(C++、矢量、循环)时,程序打印异常数字
- 为什么这个程序打印58684322800B5FD80
- 为什么不 垃圾值 正在由该程序打印
- 为什么这个程序打印"nine"两次?
- 为什么程序打印在调试和发布中浮动不同
- 如何使用Java发送HTTP GET,并使用用C++编写的CGI应用程序打印QUERY_STRING环境变量
- 为什么以下程序C++打印字符串的 ascii 值而不是字符?
- C++程序打印随机值
- C++程序打印字符串的最长单词
- 为什么我的程序打印默认构造函数
- 我希望程序打印数字 0 到 99,但是当我运行代码时,我看到 100 行 99
- 为什么我的程序打印垃圾
- 如何防止我的程序打印额外的斜杠
- 正在从信号处理程序打印堆栈跟踪
- 用程序打印时,我可以为每页指定不同的页面大小吗
- c++程序打印计数数