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