【问题标题】:What is this value? [duplicate]这个值是多少? [复制]
【发布时间】:2018-06-15 04:08:05
【问题描述】:
printf("%d", "10+10");

然后我也得到“17661648”和类似的东西

printf("%d", "Hello");

这个值是多少? "1,0,+,1,0" "H,e,l,l,o" 的总和作为十进制数的 ASCII 码?还是只是一个垃圾值?

【问题讨论】:

  • 垃圾值。您只能为%d 提供int 值,编译器会警告您。
  • 可能是字符串字面量的地址。

标签: c


【解决方案1】:

根据 C11 标准 n1570(参见其第 7.21.6.1 节),您拥有 undefined behavior (UB),这也记录在 hereprintf(3) 中。所以非常 scared,因为可能会发生任意坏的事情。因此,请养成阅读您正在使用的每个函数的文档的习惯。

如果您要求编译器反汇编程序的生成形式(例如,如果您在 Linux/x86-64 上使用 use GCC,则使用 gcc -S -O -fverbose-asm 编译)您会发现字符串文字的地址 @ 987654337@ 被传递(在 64 位上),然后被截断(在 printf 内,因为 %d)到 int。所以 17661648 可以对应该地址的最低 32 位。

细节当然是特定于实现的(并且可能因ASLR 而从一次运行到下一次运行不同,取决于编译器和ABI 和目标系统)。要真正理解和解释这种行为,需要深入了解许多细节(您的特定计算机、特定的compileroptimization 标志、特定的operating system、编译器生成的汇编程序和机器代码、特定的C standard library 等。 ...)而您不想这样做(因为这可能需要数年时间)。

您应该花几个小时阅读更多about UB。在使用 C 编程时,理解这是一个基本概念,您应该避免它。

任何好的编译器都会警告你,然后你应该改进你的代码以不收到警告。如果使用 GCC,请务必使用 gcc -Wall -Wextra -g 进行编译以获取所有警告和调试信息。然后use the gdb debugger 了解程序在系统上的实际行为。在所有情况下,请务必配置您的 C 编译器以启用所有警告和调试信息,并学习使用您的调试器。阅读How To Debug Small Programs

【讨论】:

  • 我是 C 的初学者,对它了解不多。这就是为什么我无法理解您的所有评论,但我认为这对我真的很有帮助。谢谢你给我一个学习指南,我会按照你说的去做。
  • 您绝对需要阅读有关 UB 的更多信息。它是 C 编程中的一个基本概念,即使对初学者也很重要。你应该养成编译所有警告和调试信息的习惯。因此,请阅读编译器和调试器的文档。
  • 并且任何警告都应该被理解为一个错误
【解决方案2】:

这样的事情应该可以工作:

printf("Hello");
total = 20;
printf("10+10 = %d", total);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多