C 字符串取消引用然后重新引用行为奇怪吗?

标签 c pointers printf

我有以下代码:

#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/

相关文章:

调用 printf ("%d") 两次,const 结果

c - 将数组传递给 C 中的函数

c - Vim 关键字补全

c - C 语言的套接字编程 - Web 服务器

c++ - 魔鬼不加载图像与 linux 构建

c - 通过引用将 2D VLA 数组传递给函数,返回分配的内存,无指针数组

在 C 中将 void* 从短数组 (short*) 转换为 float 数组 (float)

C++:指向包含子类的类的父指针

java - System.out.printf 与 System.out.format

c - C中字符串的十六进制