嗨,请告诉我以下输出:
main()
{
char ***x = "jjhljlhjlhjl";
char **q = *x;
printf("x:%s\n",x);
printf("q:%s\n",&q);
}
Output:
x:jjhljlhjlhjl
q:jjhl
为什么q不打印整个x?
答案 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
将获取字符串的前四个字节(即字符)。它打印仅四个字符的事实纯属机会。