有人可以解释下面代码的输出

时间:2017-07-10 12:02:28

标签: c pointers

#include <stdio.h>

int main()
{

     int arr[100];
     char *q ;
     int *p;
     arr[0]= "0xabcd";
     p = arr;
     q = p;
     printf("%x  %x",*p,*q);
     return 0;
}

输出 - 4005e4 ffffffe4

1 个答案:

答案 0 :(得分:3)

此代码充满了未定义的行为gcc的警告捕获了两个实例(因此,始终启用编译器警告!):

$ gcc -std=c11 -Wall -Wextra -pedantic -oub ub.c
ub.c: In function 'main':
ub.c:9:12: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
      arr[0]= "0xabcd";
            ^
ub.c:11:8: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types]
      q = p;
        ^

第三个是:

 printf("%x  %x",*p,*q);

%x需要unsigned int,但您传递的是intchar

你最好不要推理未定义程序的输出。

您的程序所做的是将char *(指向字符串文字的指针)的转换(未定义!)结果放入数组的第一个元素中的int。它需要两个指向第一个元素的指针,一个不兼容的类型(char *)。然后,它尝试通过这两个指针打印指针在arr[0] 中留下的内容,作为十六进制格式的unsigned int。第二个只读取一个字节,这可能是一个负值,但是当printf()期望int时,负值会扩展到4个字节。你真的应该忘记所有这些未定义的废话并编写正确的程序,因为我在这里概述的只是偶然发生,因为你的具体实现在你的机器上运行的方式。它也可以为你的猫绿色画画。