【问题标题】:char pointer and printfchar 指针和 printf
【发布时间】:2013-08-02 01:19:01
【问题描述】:

您好,请就以下输出告诉我:

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

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

}

Output:
x:jjhljlhjlhjl
q:jjhl

为什么 q 不打印整个 x ?

【问题讨论】:

  • 我是int main(),顺便说一句。
  • 实际上,K&R C 允许函数声明没有类型(int 是隐含的)

标签: c pointers printf


【解决方案1】:

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

  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 终止,所以打印出来的东西只是偶然的。

【讨论】:

    【解决方案2】:

    问题是字符串"jjhljlhjlhjl" 只是char *,而您将它分配给char ***。当您打印x 时,它会被printf 解释为char *,这最终是正确的字符串。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-04
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 2018-04-05
      相关资源
      最近更新 更多