【问题标题】:what is that value got printed when I tried to print the string with %d? [duplicate]当我尝试使用 %d 打印字符串时,打印的值是什么? [复制]
【发布时间】:2021-09-19 01:44:41
【问题描述】:
#include <stdio.h>

int main()
{
    printf("%d\n","Zara Ali"); // integer 
    printf("%s","Zara Ali"); // string
    return 0;
}

这是代码

输出是

4195828
Zara Ali

请有人解释一下。

【问题讨论】:

  • 启用编译器警告,第一个就是错误的。
  • 为什么你会认为你可以将字符串打印为整数?
  • 这不是警告.. 但感谢您的回答
  • @KenWhite IDK 我现在只想...为什么这样的结果
  • @Two_StiFleRS 那为什么my编译器会说error: format specifies type 'int' but the argument has type 'char *' [-Werror,-Wformat]

标签: c string


【解决方案1】:
printf("%d\n","Zara Ali");

此代码具有未定义的行为,因为参数的类型 (char*) 不是 %d 格式说明符 (int) 所需的类型。

“未定义的行为”意味着 C 标准对将要发生的事情没有任何要求。程序可能无法编译,可能会在运行时崩溃,可能会打印不一定是整数值或其他任何内容的随机垃圾。

最可能的结果是调用会将字符串的地址传递给printf,这会将地址解释为int 值。如果intchar* 恰好具有相同的大小,您可能会得到该内存地址的有意义的表示。 (如果您想查看该地址的有意义但由实现定义的表示,请使用printf("%p\n", (void*)"Zara Ali");。)

也有可能,但我认为不是典型的,整数和指针参数可能在不同的寄存器中传递,因此printf 打印的垃圾值可能与任何东西无关。

底线:代码不正确,需要修复。如果您的目标是创建一个工作程序,请不要浪费时间试图弄清楚它为什么会这样。

如果您对正在使用的实现的内部工作原理感到好奇,探索这样的代码行为可能会很有启发性,但不要期望它的行为始终如一。

【讨论】:

    【解决方案2】:

    从技术上讲,打印的值是文字字符串“Zara Ali”的内存位置(即在您的情况下,字符“Z”的内存位置)。

    就意图而言:打印字符串的内存位置可能不是很有用(因为您的帖子突出显示的 cmets)。

    【讨论】:

    • 从技术上讲,代码具有未定义的行为。 C 标准没有说明将要打印的值。
    • 在您的回答中,您写道:"Technically, the value printed is the memory location" -- 我对此表示怀疑。除非 OP 使用的是 32 位平台,否则很可能是 sizeof(char*) &gt; sizeof(int),因此 %d 格式说明符可能无法打印整个内存地址。在我看来更有可能只打印部分地址。无论哪种方式,行为都是未定义的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2021-06-28
    • 2016-03-20
    • 2020-01-13
    相关资源
    最近更新 更多