2012-03-18 64 views
3

程序/應用程序如何知道內存地址中的數據是某種數據類型。在C中識別內存中的值的數據類型?

例如,假設存在int a;並且假設變量a存儲在地址0x100中。存儲的信息在哪裏,它說是int

+0

另請參見[此複製](http://stackoverflow.com/questions/39206296/how-does-memory-determine-data-type-of-variable)這也吸引了一些很好的答案。 – 2016-08-30 01:05:36

回答

12

在像C這樣的語言中,信息總是以您解釋數據的方式「存儲」。編譯器添加了一些好處,它在一定程度上理解變量的類型並嘗試防止無意義的操作。

例如,假設你有位:0xFFFFFFFF。如果你將它們解釋爲「32b unsigned int」,你會得到4294967295。如果你將它們解釋爲「32b signed int」,你會得到-1(*)。如果你把它們解釋爲雙重的,上帝知道你會得到什麼。

+1

「如果你把它們解釋爲雙重的,上帝知道你會得到什麼。」問題,通常。 'double'往往是64位。如果你將它們解釋爲'float',如果使用IEEE754,則它是NaN。 – 2012-03-18 20:02:07

6

沒有地方,它只是由代碼假設。

+0

需要注意的是,在其他語言(C++)中,有一個叫vtable的動態綁定,它包含了一些關於對象類型的信息。 – Mikhail 2012-03-18 19:48:54

+1

@Misha這個問題是關於C,這就是爲什麼我沒有添加這個信息 – heinrich5991 2012-03-18 19:49:28

1

當C程序已經過去鏈接了,並且不需要在外面暴露任何符號時,這些數據就不再存在了。

數據類型與語言相關,當可執行文件準備就緒時,語言不再起作用,因爲現在它全部是內存和處理器。

3

C應用程序不存儲類型信息。唯一的執行是使用數據的方式。而在C中,濫用該強制措施是一件非常簡單的事情。

考慮以下幾點:

short s; 
short *p = &s; 
*(long*)p = 0; 

此代碼需要一個指針到短變量,然後寫入該變量,就像它是一個長。這會覆蓋超出正在使用的變量所擁有的內存,導致未定義的行爲。

+0

你可能是指'*(long *)&s'? – asaelr 2012-03-18 19:47:22

+0

哎呀!是的,固定的。 – 2012-03-18 19:48:01

+1

UB('(long)p'可能不對齊)。爲了這個例子,更好地切換開關。 – 2012-03-18 21:05:14

2

該信息未被存儲。例如,你可以做這樣的事情

int i=15; 
char *p=(char*)&i; 
char c=*p; //Now, c contain the first byte of 15, which may be 15 or 0 

但不這樣做,除非你真的知道你會怎麼做。像這樣的東西不重要是錯誤的常見方式。

+0

這爲什麼會出錯?如果我們printf(「%c」,c)會發生什麼; – 2012-03-18 19:58:56

+0

@SharatChandra如果你知道自己在做什麼,那很好。只是如果有人不知道和做這樣的事情,通常是無稽之談。 – 2012-03-18 20:04:03

+0

@SharatChandra就像丹尼爾寫道的那樣,當你知道自己在做什麼的時候,這很好,但即使在這個簡單的例子中,「c」可能是0或15.在更復雜的情況下,我們還需要小心對齊。 – asaelr 2012-03-18 21:33:07