2

嗨,请就以下输出告诉我:

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

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

}

Output:
x:jjhljlhjlhjl
q:jjhl

为什么 q 不打印整个 x ?

4

2 回答 2

5

您的程序调用未定义的行为,因此它可能输出的内容实际上没有任何限制。

  char ***x = "jjhljlhjlhjl";

虽然x是一个指向指针的指针,但它被分配了一个字符串字面量的地址。

  char **q = *x;

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

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

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

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

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

的地址q被传递给printf()。由于%s提供了,指针值被视为字符串。但是,取消该指针的内容实际上sizeof(char **)是字符串文字的字节。不能保证读取的字节会被正确NUL终止,所以打印出来的东西只是偶然的。

于 2013-08-02T01:30:11.917 回答
1

问题是字符串"jjhljlhjlhjl"只是 a char *,而您将其分配给 a char ***。当您 printx时,它被解释为char *by printf,最终成为正确的字符串。

至于&q作为字符串地址打印,您实际上是在打印q. 当您取消引用时x,您会得到 a char **,在您的情况下,它是 4 个字节。但是因为x实际指向文本数据,所以*x会抓取字符串的前四个字节(即字符)。它只打印四个字符的事实纯属偶然。

于 2013-08-02T01:27:00.580 回答