2011-03-08 86 views
1

我讀過一段,但我不明白這是什麼意思....誰能解釋一下嗎?該段爲:這個關於char指針的引用是什麼意思?

處理單個字符作爲 的char *字符串可導致致命 運行時錯誤。 char *字符串是一個 指針,可能是一個大整數。 然而一個字符是一個整數(ASCII 0-255)的小型 。在許多系統上, 解引用一個char vaalue導致 錯誤,因爲低內存地址 被保留用於特殊目的,如 操作系統中斷 handlers-這樣的「記憶違反」 發生。

+3

我應該說,這個通道的sooo錯過:) – 2011-03-08 10:47:31

+0

這個問題很可能是C,而不是C點++。在C++文本中,你會看到很多'char * string'(在C++中'string'是一個類型,即使它在'std'命名空間中也不會與該聲明發生衝突,所以大多數人避免調用它們的字符串'string ') – 2011-03-08 10:51:10

回答

6

這意味着你不應該做這樣的事情:因爲有一個字符,一個字符指針之間的巨大差異

char *pCh = 'A'; // this is the value 0x41 (assuming ASCII). 
char Ch = *pCh; // probably not what you wanted. 

事實上,一個體面的編譯器應該給你一個警告,當你試圖做這樣的事情。

其餘的解釋一個可能的影響。如果您在一個系統中工作,其中值爲8位,則它們將只能保存0到255之間的值(ISO C標準允許char值更大但不常見)。從該值集合中隨機選擇的指針是非常有用的。

這不是完全出了問題,因爲你可能是在嵌入式系統上的,你有內存映射I/O那裏,但是,在這種情況下,你會更傾向於使用類似#define IOPORT7 0x0041和使用IOPORT7而不是'A'

另一方面,指針往往能夠指向整個地址空間,可以是32位寬(或更大)的地址空間。 32位爲您提供了大約四個十億個指針可以指向的可能值。

+0

對不起,但那是錯誤的。如果pCh是一個指向字符的指針,那麼可以取消引用它來檢索指向的字符。如果沒有,字符指針究竟會有什麼好處呢? – Axel 2011-03-08 11:01:25

+0

@Axel,我沒有說你無法解除引用。我說你不應該這樣做。我之所以這麼說是因爲你已經將它設置爲「A」,而不是「A」,它在ASCII中是0x41,並且_very_不可能是有效的指針。僅僅因爲你可以做一些事情並不是一個好主意:-) – paxdiablo 2011-03-08 11:05:05

+0

這是一個有效的指針。它只是不是一個指向零終止字符串的指針。 – Axel 2011-03-08 11:10:28

1

這意味着,如果你有一個字符,即:

char c = 'p'; 

不要試圖取消引用C,即做*c,因爲這會導致不確定的行爲。

+2

這不是未定義的行爲,這是編譯時錯誤。 – Axel 2011-03-08 10:57:55

0

我有點擔心該段的來源 - 它感覺很古老。

每個現代操作系統都提供了protected memory。每個進程都有自己的地址空間,並且物理機器的低內存不是而是,而不執行某些相當重要的操作(例如Linux系統上的iopl(2)ioperm(2))。

低存儲器未被映射成過程,因爲它是捕捉試圖寫入到NULL指針(它本質上是地址0x0)和char變量(而不是char *變量)的最簡單的方法。操作系統可以很好地將虛擬地址0x0中的頁面映射到任何想要的內存頁面。 (映射零頁有時需要古代或神祕系統的兼容模式執行。)

當然,如果您正在閱讀關於編程機器的指南,而沒有MMUs,那麼它有一定的道理,但我會仍然很謹慎。

2

我會傾倒這本書或無論你從那裏得到的報價。什麼是大概意思是,你不應該嘗試這樣的事:

char c = 'a'; 
strcmp(&c,"a"); // might accidentally work on some systems, but behaviour is undefined