/*Suppose we initiate a pointer;*/
int *y;
y=36;
/*Is this allowed in C??*/
/* If it is, what will happen if we write to this;*/
*y= 100;
/*And if its not, then why ?*/
也請解釋這是如何工作在內存分配。如果在C中指定一個整數值會發生什麼?
/*Suppose we initiate a pointer;*/
int *y;
y=36;
/*Is this allowed in C??*/
/* If it is, what will happen if we write to this;*/
*y= 100;
/*And if its not, then why ?*/
也請解釋這是如何工作在內存分配。如果在C中指定一個整數值會發生什麼?
您無法在C.
一個整數值分配給一個指針對象有在那裏你可以出現這樣做的一個特例。常數0
(或更一般地說,具有值零的整數常量表達式)是空指針常量。但即使在這種情況下,該值也會隱式轉換爲適當類型的空指針,並且它是空指針值,而不是整數值0
,它將存儲在y
中。
int *y;
y = 36;
分配是約束違反。這意味着任何符合要求的編譯器都必須爲包含它的程序發出診斷消息。基本上這意味着這個任務是非法的(儘管C標準並沒有把它稱爲)。它使大約多大意義的
double x = "hello, world";
在很老版本的C,之前的語言是標準化的,被普遍允許指定任意整數值指針。因此,許多編譯器將允許這樣的分配,而僅僅打印警告而不是致命的錯誤消息。這裏的教訓並不是說這不是一個嚴重的錯誤。教訓是,應該認爲編譯器警告(至少其中一些)與致命錯誤消息一樣嚴重。
現在你可以做的是明確的整數值轉換爲指針類型,使用強制:
y = (int*)36;
由於標準說,這種轉換的結果
是實現定義的,可能未被正確對齊,可能不是 指向引用類型的實體,並且可能是陷阱 表示。
如果您嘗試讀取或寫入*y
指示的對象,您的程序的行爲是未定義的。 如果幸運的話,它會崩潰並顯示一條錯誤消息。如果你不走運,它可能表現「正確」。
在極少數情況下,您碰巧知道您可以在機器地址36
(更可能表示爲0x24
)訪問的對象爲int
,這將是訪問它的方式。
除非您在嵌入式系統上進行非常低級的編程,否則幾乎可以肯定的是,在該地址處沒有這種可訪問的對象。
底線:不要這樣做。如果你的編譯器讓你放棄它,那真的沒有任何好處。找出你的編譯器使用哪些選項來使它更嚴格。
我看不到任何研究證據。 – 2014-11-20 18:22:44
你爲什麼不試試看? – 2014-11-20 18:30:09
@JohnLedbetter:由於行爲未定義,試一試並不能完全回答這個問題。 – 2014-11-20 18:35:14