char指针和printf

use*_*844 2 c printf pointers

嗨,请告诉我以下输出:

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?

jxh*_*jxh 5

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

  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终止,因此根本就会出现打印的内容.