我有以下代码:
#include <stdio.h>
int main(){
char *p = "abc";
char c = *p;
printf(&c);
return 0;
}
运行,我明白
[OP@localhost test]$ gcc ptr.c
[OP@localhost test]$ ./a.out
a%QV[OP@localhost test]$
我期望它只打印“abc”。为什么会出现这种情况?
最佳答案
char c = *p;
这会打印字符串 "abc"
中第一个字母的硬拷贝,仅此而已。
因此,您最终对 printf
撒了谎,并告诉它在单个字符 c
的地址处,它将找到一个完整的、有效的格式字符串。
但它只会找到根本不是字符串的字符a
,因为任何地方都没有空终止符。所以任何事情都可能发生,包括程序崩溃或程序打印垃圾。
关于C 字符串取消引用然后重新引用行为奇怪吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57855844/