首页 > 解决方案 > C字符串取消引用然后重新引用行为奇怪?

问题描述

我有以下代码:

#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”。为什么会这样?

标签: cpointersprintf

解决方案


char c = *p;这对字符串中的第一个字母进行了硬拷贝,仅此"abc"而已。

因此,您最终撒谎printf并告诉它在单个字符的地址处c,它将找到一个完整的有效格式字符串。

但它只会找到a根本不是字符串的字符,因为任何地方都没有空终止符。所以任何事情都可能发生,包括程序崩溃或程序打印垃圾。


推荐阅读