int k= "hello";
printf("%s", k);
为什么即使k的数据类型是整数,这个hello也会打印出来?
答案 0 :(得分:4)
您的代码会调用Undefined Behavior。
int k= "hello";
您正尝试使用字符串文字(int
)初始化char*
。这没有任何意义,并调用UB。
printf("%s", k);
您正在尝试使用int
打印%s
,char*
需要AbandonedMutexException
。这也没有意义,并调用UB。
答案 1 :(得分:1)
注意 - 所做的是错误的,几乎提供了不可取的 结果(忽略警告在某些情况下是犯罪,这是一个 那些情况)。
参考为什么它为你打印字符串,这是我的解释
在给定格式说明符%s的情况下,给定参数被识别/解释为字符串的基址(char *)。现在char *和int在逻辑上是相等的(忽略C施加的符号和其他属性)
所以处于非常原始的水平
int a = "String" ;
可能看起来像这样
a contains Base address of String ( this is some read only location )
+-----+-----+-----+-----+
| 0x123456 |
+-----+-----+-----+-----+
And String may be defines as below with 'S' at location 0x123456
0x123456
+-----+-----+-----+-----+-----+-----+-----+
| S | t | r | i | n | g | \0 |
+-----+-----+-----+-----+-----+-----+-----+
%s格式说明符的参数将被视为(char *)
现在在%s的情况下,因为格式说明符程序应该扫描从给定地址开始的内存的每个字节并将其转换为char然后再打印(当然,根据可打印的值而不是结果可能相当于 可怕的)
在我们的例子中,虽然取消引用a的给定值到char *不会产生任何问题因此没有错误,但是这不一定是所有时间的情况。各种原因。
答案 2 :(得分:0)
这里,hello
是一个字符串文字,因此它存储在可执行文件的文本部分(沿着代码),当你将它分配给一个整数时,实际上指向文字的指针将被分配给整数。由于两者通常具有相同的大小(4字节),因此不存在堆栈溢出等问题。
printf将正常工作,因为它将转到存储在变量(这里是k)中的地址,并将打印字符串,直到找到字符串\0
的结尾。
答案 3 :(得分:0)
您的代码无视C类型系统,因此在尝试理解您的代码时需要忽略类型系统。
我希望你的机器上有sizeof(int)== sizeof(char *)。 const char * literal分配给k。这是有效的,因为您机器上的每个字节都有一个整数地址。 "引擎盖下"对于类型系统,指针就是这个整数。
printf有效,因为它将k作为const char *解释为以null结尾的数组,这是你赋给k的数据。
正如其他人所指出的那样,您的代码无法保证正常运行,因此它不应该出现在您计划发布的任何软件中。