【发布时间】:2017-01-30 05:31:06
【问题描述】:
#include <stdio.h>
int main () {
char c = 'A';
int *int_ptr;
double *double_ptr;
*int_ptr = *(int *)&c;
*double_ptr = *(double *)&c;
printf("Original char = %c \n", c);
printf("Integer pointer = %d \n", *int_ptr);
printf("Double pointer = %f\n", *double_ptr);
return 0;
}
问题是——为什么我不能使用这段代码分配double_ptr,因为它会导致分段错误,但对于整数却可以正常工作?
据我了解,char 是 1 字节长,int 是 4 字节长,所以 double 是 8 字节长。
通过使用表达式*(double *)&c,我期望得到以下结果:
- &——获取c的内存地址。
- (double *) – 假装这是一个指向 double 的指针。
- *() – 获取实际值并将其分配给 double var。
【问题讨论】:
-
1) 你知道你在做什么是“错误的”。 2) 如果你很好奇为什么会出现分段错误,为什么不用 -S (gcc) 或 /Fa (MSVC) 编译并查看汇编输出?
-
首先,指针后面没有任何内存,所以
*int_ptr正在寻址不属于您的内存,即 UB。您甚至不知道指针未初始化的位置。除此之外,您尝试使用 int(4 或 8 个字节)读取一个 char(1 个字节),这又是 UB。