这是因为 %s 在 printf 里并不是输出一个整数,而是把传进去的参数当作一个字符串的地址来用。
如果你用数字给 %s 赋值,比如:
c复制编辑printf("%s", 1234);
编译虽然可能不报错,但运行时会出错,甚至直接段错误(Segmentation fault)。
原因是:
- %s 的含义
%s要求对应的参数类型是char*(指向以\0结尾的字符串的首地址)。printf会把这个地址当作内存指针去读取数据,并依次打印,直到遇到\0结束。
- 数字不是地址
- 当你写
1234时,这是一个整数常量,不是一个有效的内存地址。 printf会直接把1234当成一个地址来访问,比如去访问内存地址0x000004D2(1234 的十六进制是 0x4D2),结果很可能访问到无效内存 → 段错误。
- 当你写
- 为什么
%d没事%d才是用来输出int的,它直接按整数值来读取,不会把它当作指针去访问内存,所以安全。
如果你确实想用数字来表示字符串内容,有两种安全的写法:
c复制编辑// 方式 1:用数组
char str[] = "1234";
printf("%s\n", str); // 正确
// 方式 2:用字符串字面量
printf("%s\n", "1234"); // 正确