对于下面的代码spinet:
#include <stdio.h>
int main(void) {
int x = 12345678;
char *a = x;
printf("%d\n", x);
printf("%d\n %d\n %d\n %d\n", a[0], a[1], a[2], a[3]);
return 0;
}
GNU GCC v7.1.1的输出:超时:被监控的命令转储 core sh:第1行:11792分段故障超时 10s main
请注意以下工作。
#include <stdio.h>
int main(void) {
int x = 12345678;
char *a;
*a = x;
printf("%d\n", x);
printf("%d\n %d\n %d\n %d\n", a[0], a[1], a[2], a[3]);
return 0;
}
这两种情况都不正确。
在这两种情况下,你都是将一个整数值赋给一个指针。 这个值会被视为一个有效的内存位置并被取消引用。 但它并不是一个有效的内存位置,所以我们调用了 未定义行为.
在第一种情况下,UB表现为崩溃,在第二种情况下,它表现为看起来可以正常工作。
你需要做的是将 地址 的 x
到 a
. 然后,你可以读取组成 int
.
char *a = (char *)&x;