为什么这样做? (即如何将 int
传递给 printf()
导致打印字符串)
#include<stdio.h>
int main() {
int n="String";
printf("%s",n);
return 0;
}
警告:初始化从指针生成整数而没有强制转换[默认情况下启用] int n =“String”;警告:格式'%s'需要类型'char *'的参数,但参数2的类型为'int'[-Wformat =] printf(“%s”,n);
输出:字符串
编译器:gcc 4.8.5
4 回答
在你的代码中,
是高度依赖于实施的注释1
和
调用undefined behavior . 注2 Don't do that .
Moral of the story: 警告是有原因的,请注意他们 .
Note 1:
引用
C11
,章节§6.3.2.3Note 2:
第§7.21.6.1
和
%s
格式说明符的参数类型printf()
程序的行为未定义 .
基本上,您将
const char*
分配给int
,printf
将其转换回来 . 但是要把它视为完全巧合:你不能像那样抛出不相关的类型 .C让你有能力用脚射击自己 .
int
类型可以在今天的大多数计算机上存储4个字节的数字(从-2147483647到2147483647)这意味着它“”可以“”存储一些地址,唯一的问题是当你的地址大于2147483647它会导致溢出并且你将无法获得地址,(这对你的程序来说非常糟糕)
地址是指存储空间的数字,指针用来存储地址,它们更大(64位系统上8字节,32位系统上4字节),它们也是无符号的(只有正数)
这意味着,当你影响
int n="String";
,如果"String"
的地址低于2147483647它不会导致问题,你的代码将运行(不要这样做)http://www.tutorialspoint.com/c_standard_library/limits_h.htm
现在,如果你考虑一下,你可以猜到为什么32位系统有4GB的ram限制
(抱歉可能出现英语错误,我是法国人)
使用
-Wall -Wextra -Werror -Wint-to-pointer-cast -pedantic
(GCC)等选项进行编译将很快向您显示不应依赖此行为 .