我正在学习C语言以获得乐趣。在我的第一部分代码中(通过' Learn C the Hard Way')我故意在printf语句中省略了变量。
#include <stdio.h>
int main() {
int age = 3;
printf("I am %d years old.\n");
return 0;
}
非常简单。它按照我的预期编制并投入收益。但是当我愚蠢地运行破碎的程序时,我得到一个不寻常的输出:
I am 1476430496 years old.
每次我运行它时,数字都不同但相似。我想也许它是“年龄”的记忆地址。所以我试过了:
printf("age is %p\n", &age);
但那不是它:
I am 1570798240 years old.
age is 0x7fff5da07a78
所以我很好奇。这个号码是多少?它从何而来?我尝试了不同的输出类型(%s,%e,%u),事情变得更加怪异。
作为一个后续问题,当我尝试%p没有变量时,我 获取了一个内存地址。
I am 0x7fff53e8caa0 years old.
我也很好奇这个地址来自哪里?有什么方法可以看出它里面可能包含什么?
感谢您的时间和任何帮助!
麦克
答案 0 :(得分:3)
Printf
将尝试读取您在格式字符串中指定的变量。在这种情况下,它正在读取堆栈中的下一个4或8个字节并将其解释为整数或指针,因为你告诉它会有一个整数或指针。
无论发生什么事都是你所看到的。它完全有可能是先前在该内存空间中执行的进程留下的一些字节。
正如其他人指出这种行为在技术上未被语言定义,您可以编写编译器以多种方式实现此案例,包括崩溃。只是碰巧最简单的事情是信任格式字符串并继续读取,通常有足够的空间映射到堆栈,以便返回某些东西。
答案 1 :(得分:0)
未定义的行为。
printf()不会更改传递给它的变量的内容, 所以你只需传递变量的值。
您可以阅读手册中有关printf 的格式说明符。 printf中的格式说明符不匹配导致Undefined behavior。