char指针和printf

时间:2013-08-02 01:19:02

标签: c pointers printf

嗨,请告诉我以下输出:

main()
{
  char ***x = "jjhljlhjlhjl";
  char **q = *x;

  printf("x:%s\n",x);
  printf("q:%s\n",&q);    

}

Output:
x:jjhljlhjlhjl
q:jjhl

为什么q不打印整个x?

2 个答案:

答案 0 :(得分:5)

您的程序会调用未定义的行为,因此对其输出的内容没有任何限制。

  char ***x = "jjhljlhjlhjl";

虽然x是指向指针的指针,但它被赋予字符串文字的地址。

  char **q = *x;

q是指向指针的指针,并被赋予解除引用x的结果。由于x实际上指向的是不兼容类型的对象,因此引用它的结果是未定义的。

如果我们假装这样可以工作,那么*x现在是一个指向指针的指针,因此它可能会将字符串文字的sizeof(char **)个字节视为一个地址,将该值分配给q

  printf("x:%s\n",x);

由于x是一个指针,该指针值将传递给printf()。由于提供了%s,因此指针值被视为字符串。由于x被分配了字符串文字的地址,因此该字符串将被打印。

  printf("q:%s\n",&q);    

q的地址传递给printf()。由于提供了%s,因此指针值被视为字符串。但是,引用该指针的内容实际上是字符串文字的sizeof(char **)个字节。无法保证读取的字节将被正确NUL终止,因此根本就会出现打印的内容。

答案 1 :(得分:1)

问题是字符串"jjhljlhjlhjl"只是char *,而您将其分配给char ***。当您打印x时,它会被char *解释为printf,它会成为正确的字符串。

对于打印&q作为字符串地址,您可以有效地打印q的内容。当您取消引用x时,会得到一个char **,在您的情况下,它是4个字节。但由于x实际指向文本数据,*x将获取字符串的前四个字节(即字符)。它打印四个字符的事实纯属机会。