ash*_*shu 5 c string int printf
为什么这样做?(即如何传递int给printf()打印字符串的结果)
#include<stdio.h>
int main() {
int n="String";
printf("%s",n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
警告:初始化从指针生成整数而没有强制转换[默认情况下启用]
int n ="String";
警告:格式'%s'需要类型'char*'的参数,但参数2的类型为'int'[-Wformat =]
printf("%s",n);
输出:字符串
编译器:gcc 4.8.5
在你的代码中,
int n="String"; //conversion of pointer to integer
Run Code Online (Sandbox Code Playgroud)
是高度依赖于实施的注释1
和
printf("%s",n); //passing incompatible type of argument
Run Code Online (Sandbox Code Playgroud)
调用未定义的行为.注意2 不要这样做.
故事的道德:警告是有原因的,要注意他们.
注1:
引用C11,章节§6.3.2.3
任何指针类型都可以转换为整数类型.除非先前指定,否则结果是实现定义的.如果结果无法以整数类型表示,则行为未定义.[....]
笔记2:
第§7.21.6.1
[....]如果任何参数不是相应转换规范的正确类型,则行为未定义.
以及%s格式说明符的参数类型printf()
s如果不存在l长度修饰符,则参数应为指向字符类型数组的初始元素的指针.[...]
程序的行为未定义.
从本质上讲,你分配const char*一个int,并且printf将其转换回.但是要把它视为完全巧合:你不能像那样抛出不相关的类型.
C让你有能力用脚射击自己.
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |