为何使用%d格式符打印字符串会输出数值4195828?C语言代码输出解析
用%d打印字符串时输出的数值到底是什么?
先把你贴的代码放出来方便大家看:
#include <stdio.h> int main() { printf("%d\n","Zara Ali"); // integer printf("%s","Zara Ali"); // string return 0; }
你看到的4195828,其实就是字符串"Zara Ali"在你当前程序运行时的内存首地址的十进制表示。
为啥会出现这种情况?给你掰扯清楚:
- 在C里,字符串字面量(比如
"Zara Ali")本质是个char数组,而数组名在绝大多数场景下会自动转成指向数组第一个元素的指针(也就是char*类型)。 printf的%d格式符是用来输出十进制整数的,但你这里传进去的是个指针。printf不管你传的类型对不对,它会直接把这个指针存储的内存地址值,当作整数来解析输出——于是就出现了那个看起来莫名其妙的数字。- 注意哦,这个数字不是固定的!每次运行程序,或者换个操作系统/编译器,这个数值都可能变,因为字符串字面量加载到内存的位置不一定相同。
另外要提一句:这种写法属于C标准里的未定义行为,因为格式符和参数类型不匹配。虽然大多数情况下会输出地址数值,但标准没保证一定这么干,极端情况下甚至可能导致程序崩溃。要是你真的想打印字符串的地址,应该用%p格式符,比如:
printf("%p\n", "Zara Ali");
这样会输出标准格式的指针地址(一般是十六进制)。
内容的提问来源于stack exchange,提问作者Two_StiFleRS
相关产品推荐
相关产品推荐

