新手Q - 当我在printf

时间:2016-12-16 06:46:09

标签: c

我正在学习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.

我也很好奇这个地址来自哪里?有什么方法可以看出它里面可能包含什么?

感谢您的时间和任何帮助!

麦克

2 个答案:

答案 0 :(得分:3)

Printf将尝试读取您在格式字符串中指定的变量。在这种情况下,它正在读取堆栈中的下一个4或8个字节并将其解释为整数或指针,因为你告诉它会有一个整数或指针。

无论发生什么事都是你所看到的。它完全有可能是先前在该内存空间中执行的进程留下的一些字节。

正如其他人指出这种行为在技术上未被语言定义,您可以编写编译器以多种方式实现此案例,包括崩溃。只是碰巧最简单的事情是信任格式字符串并继续读取,通常有足够的空间映射到堆栈,以便返回某些东西

答案 1 :(得分:0)

未定义的行为

  

printf()不会更改传递给它的变量的内容,   所以你只需传递变量的值。

您可以阅读手册中有关printf 的格式说明符。 printf中的格式说明符不匹配导致Undefined behavior