c - 使用未提供给它们的数据的函数
问题描述
函数 2 和 3 如何在 printf 中获取整数和浮点数?这很有趣,很想知道为什么?它与堆或堆栈有关吗?
#include <stdio.h>
#include <stdlib.h>
void function1(void){
int A = 50;
int B = 42;
float X = 3.1459;
float Y = 2.71828;
printf(“Function 1\n”);
printf(“%d+%d=%d\n”, A, B, A+B);
printf(“%f+%f=%f\n”, X, Y, X+Y);
}
void function2(void){
int v1, v2;
float cs, ua;
printf(“Function 2\n”);
printf(“v1+v2=%d\n”, v1+v2);
printf(“cs+ua=%f\n”, cs+ua);
}
void function3(void){
float cs, ua;
int v1, v2;
printf(“Function 3\n”);
printf(“v1+v2=%d\n”, v1+v2);
printf(“cs+ua=%f\n”, cs+ua);
}
Int main(void){
function1();
function2();
function3();
return 0;
}
输出:
Function 1
50+42=92
3.145900+2.718280=5.864180
Function 2
v1+v2=92
cs+ua=5.864180
Function 3
v1+v2=92
cs+ua=5.864180
解决方案
这是一种未定义的行为:当您不初始化局部变量时,标准没有定义在这种情况下要做什么。
这意味着它可能取决于您使用的编译器。
可能发生的情况是您获得了一些堆栈空间来存储变量,但由于您没有设置值,它使用先前写入该空间的值。
它可能是由另一个程序编写的,或者以前使用过这个内存位置的任何程序。它可能为 0,因为该内存位置从未使用过,您不知道,行为未定义(您无法定义行为,您无法预测值将是什么)。
它们也在堆栈上,堆用于动态内存,就像您使用malloc
.
推荐阅读
- c++ - C++:指向向量(及其元素)的指针是否稳定,因为随着向量的增长,向量会在内存中迁移以适应更多元素?
- ruby - RUBY 将单词拆分为字母和数字
- javascript - 未找到此依赖项:* core-js/fn/symbol
- java - 使用 MyBatis TypeHandler 将结果从 SP 映射到复杂对象
- python - 在 python 中使用 git 子模块
- android - 如何在 Jetpack Compose 中直接使用颜色资源?
- opencv - 从图像点计算 x,y 坐标 (3D) 不起作用
- python - 为部署在 GAE 上的应用程序在 GCE 上添加防火墙规则
- python - 向量的总欧几里得长度
- python - 在python中访问翻译本体时堆栈溢出