嗨,请告诉我以下输出:
main()
{
char ***x = "jjhljlhjlhjl";
char **q = *x;
printf("x:%s\n",x);
printf("q:%s\n",&q);
}
Output:
x:jjhljlhjlhjl
q:jjhl
Run Code Online (Sandbox Code Playgroud)
为什么q不打印整个x?
您的程序调用未定义的行为,因此对它可能输出的内容没有任何限制.
char ***x = "jjhljlhjlhjl";
Run Code Online (Sandbox Code Playgroud)
虽然x
是指向指针的指针,但它被赋予字符串文字的地址.
char **q = *x;
Run Code Online (Sandbox Code Playgroud)
q
是指向指针的指针,并被赋予解除引用的结果x
.由于x
实际上指向的是不兼容类型的对象,因此引用它的结果是未定义的.
如果我们假装这应该工作,那么*x
现在是指向指针的指针,因此它可能将sizeof(char **)
字符串文字的字节视为一个地址并将该值赋值给q
.
printf("x:%s\n",x);
Run Code Online (Sandbox Code Playgroud)
由于x
是一个指针,该指针值被传递给printf()
.由于%s
提供了,指针值被视为字符串.由于x
分配了字符串文字的地址,因此该字符串是打印的.
printf("q:%s\n",&q);
Run Code Online (Sandbox Code Playgroud)
地址q
传递给printf()
.由于%s
提供了,指针值被视为字符串.但是,引用该指针的内容实际上sizeof(char **)
是字符串文字的字节.无法保证读取的字节将被正确NUL
终止,因此根本就会出现打印的内容.
归档时间: |
|
查看次数: |
3540 次 |
最近记录: |