繁体   English   中英

如何将字符串赋值给int并将该int传递给printf正确打印字符串?

[英]How does assigning a string to int and passing that int to printf prints the string properly?

为什么这样做? (即如何将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”,正);

输出:字符串

编译器:gcc 4.8.5

在你的代码中,

  int n="String";  //conversion of pointer to integer

是高度依赖于实施的注释1

 printf("%s",n);   //passing incompatible type of argument

调用未定义的行为 注意2 不要这样做

故事的道德:警告是有原因的,要注意他们。


注1:

引用C11 ,章节§6.3.2.3

任何指针类型都可以转换为整数类型。 除了之前指定的以外,结果是实现定义的。 如果结果无法以整数类型表示,则行为未定义。 [....]

笔记2:

第§7.21.6.1

[....]如果任何参数不是相应转换规范的正确类型,则行为未定义。

printf() %s格式说明符的参数类型

s如果不存在l length修饰符,则参数应为指向字符类型数组的初始元素的指针。 [...]

程序的行为未定义

基本上,您将一个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)等选项进行编译将很快向您显示不应依赖此行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM