2017-01-23 71 views
0

我目前在學習如何用C編程。今天我開始用指針,並且遇到了以下情況。當我編譯程序與參考變量不同類型的指針

#include<stdio.h> 

int main() { 

    int a; 
    double * p; 
    p = &a; 
    *p = 12.34; 
    printf("%d\n",a); 
    * (int *) p = 12.34; 
    printf("%d\n",a); 

    return 0; 
} 

它說

$ gcc zeigertypen.c 
zeigertypen.c: In function ‘main’: 
zeigertypen.c:7:7: warning: assignment from incompatible pointer type [-Wincompatible-pointer-types] 

,並在執行時,我得到的輸出

2061584302 
Speicherzugriffsfehler (Speicherabzug geschrieben) 

的錯誤消息是德國這樣的事情

memory access error (core dumped) 

但是,如果我註釋掉線*p = 12.34;錯誤消失,輸出是

0 
12 

代碼的目的是用不同類型的比它們所引用的變量的指針來演示該問題。根據我使用的學習C++的教科書,輸出應該是

2061584302 
12 
+3

我會得到一個新的教科書,看起來它告訴你包括c頭並指定未定義行爲的輸出。 – George

+0

它實際上是C,而不是C++,我在@George中編程。對不起,這個錯誤。 –

+1

好吧,無論哪種方式,我會看這本書的年齡和有效性,也許這是對你說謊,並會轉向關於[UB](https://en.wikipedia.org/wiki/Undefined_behavior)的部分,但如果不,很好......:/ – George

回答

5

p = &a;的行爲實際上是不確定

C和C++都不允許您重新解釋&a(它是指向int的指針)的類型,作爲指向double的指針。

(int*)p也是類似的問題,雖然到那時損害已經完成。

你被允許轉換爲void*,再換從void*原始類型:現在,把這些看做是唯一的情況下,您可以將指針的類型,不同的類型。

+0

因此,因爲我們將'p'定義爲一個'double *'指針,'p =&a'是不確定的? –

+3

絕對如此。如果你寫這個,編譯器保留吃你的貓的權利。 (最有可能發生的事情是* p在你的指針「p」之後拋棄了內存),'double'可能是你係統中比'int'更大的類型。 – Bathsheba

+0

我實際上可以通過使用float而不是double來避免錯誤。但是,再次,教科書並沒有假定double與int具有相同的大小。所以可以說,這本書還在說謊。 –

0

闡釋與代碼:(ACC您教材)

#include<stdio.h> 

int main() { 

    int a; // size let say (2 byte or 4) 
    double * p; // it will point to continous memory of 8 byte 
    p = &a;  // Now because of this ,starting from first byte of a it will derefer 8 bytes (but Undefined behaviour acc to C standards) 
    *p = 12.34; // assigned to those 8 bytes 
    printf("%d\n",a); // first (2 or 4) bytes of that value in *p assignment as it starts from a 
    * (int *) p = 12.34; // now you type casted it to derefer 2 bytes so store 12 in those (2 or 4) bytes as int 
    printf("%d\n",a); // first (2 or 4) bytes of that value in *p assignment 

    return 0; 
} 

如果你需要更多的解釋評論問我。謝謝。

+0

這是;)但這不是因爲我不喜歡你o.O我只是不認爲解釋解釋了op的輸出,這是他們的問題。我會撤銷DV,因爲雖然我懷疑這會幫助它可能會幫助其他人:) – George

+0

幫助!因爲我喜歡幫助初學者畢竟我是一名老師,所以我喜歡幫助這只是@George – 2017-01-23 14:48:59

+0

@George這怎麼會幫助任何人? 「解釋」甚至不對... – Geoff