2017-01-30 100 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*,然後取消引用會得到從內存中的額外的字節數一些,這是未定義行爲