嗨,请就以下输出告诉我:
main()
{
char ***x = "jjhljlhjlhjl";
char **q = *x;
printf("x:%s\n",x);
printf("q:%s\n",&q);
}
Output:
x:jjhljlhjlhjl
q:jjhl
为什么 q 不打印整个 x ?
您的程序调用未定义的行为,因此它可能输出的内容实际上没有任何限制。
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
终止,所以打印出来的东西只是偶然的。
问题是字符串"jjhljlhjlhjl"
只是 a char *
,而您将其分配给 a char ***
。当您 printx
时,它被解释为char *
by printf
,最终成为正确的字符串。
至于&q
作为字符串地址打印,您实际上是在打印q
. 当您取消引用时x
,您会得到 a char **
,在您的情况下,它是 4 个字节。但是因为x
实际指向文本数据,所以*x
会抓取字符串的前四个字节(即字符)。它只打印四个字符的事实纯属偶然。