2017-01-30 64 views
0
#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我想到以下几点:

  1. & - 获取C的内存地址。
  2. (double *) - 假设这是一个加倍的指针。
  3. *() - 获取实际值并将其分配给double var。
+0

1)你知道你在做什么是“错误的”。 2)如果你很好奇你为什么会出现分割错误,为什么不用-S(gcc)或/ Fa(MSVC)编译并查看程序集输出? – paulsm4

+2

首先你没有任何指针后面的内存,所以'* int_ptr'寻址不属于你的内存,即UB。您甚至不知道指针未初始化的位置。除此之外,您尝试使用int(4或8字节)再次读取char(1字节),这也是UB。 – 4386427

回答

3

您的代码有未定义的行为。因此可能发生任何事情

UB是因为你正在铸造一个char这是一个字节的类型是4和8字节,这意味着你(可能)访问内存越界或错误的对齐。

对于任何特定的系统,这样做是否会“起作用”或“不起作用”并不相关,因为代码是错误的。

1

在你的程序,强制转换的charint*double*,然后取消引用会得到从内存中的额外的字节数一些,这是未定义行为