2015-07-11 65 views
-5

enter image description here 32位系統中的字大小爲4個字節。 so char a ='bcd';已驗證。 4個ASCII字符可以適合32位整數。混淆在char a ='abc';行爲C編程

char a='bcd'; 
//output is d for this line 
printf("%c\n",a); 

//output is 'z' when i use *(&a-1) and '�'(is -67 when manipulated) 
printf("%c\n",*(&a-1)); 

現在這裏我只是想知道&a-1 (this is not 'b')會指向什麼?它是最後的內存地址嗎? 還有一件事是什麼是字符被包裝到int的順序。

------------------------------------------------------------------------------ 
| bits : _ _ _ _ _ _ _ 8 _ _ _ _ _ _ _ 16 _ _ _ _ _ _ _ 24 _ _ _ _ _ _ _ 32 | 
| order : ? ? ? ? ? ? ? 8 ? ? ? ? ? ? ? 16 ? ? ? ? ? ? ? 24 ? ? ? ? ? ? ? 32 | 
------------------------------------------------------------------------------ 
+0

''bcd''不是一個有效的'char'文字。也許你對像字符串文字這樣的東西感到困惑:''bcd「'。 –

+1

你不能這樣做'char a ='bcd'' – user007

+0

是什麼讓你認爲'char'的大小是'32bit integer'? – deviantfan

回答

6

「so char a ='bcd'; is valid。」不,它不是,至少不是在這個意義上,你會期望(是的,'bcd'是一個多字節字符常量,但也不存儲多個字符,你似乎想到,卻是一些實現定義編號)。

A char擁有一個單個字符,它總是一個字節長。寫char a給你一個字節來玩。你不能通過a訪問前後的字節。如果編譯器不需要,不是需要在你的char周圍添加任何填充。由於文字'bcd'有(至少在我的系統)不適合到char(6447972我的系統上)的值,你結束了一個單一的一個字節char具有實現定義的值。即使在a附近有填充字節,也不能假定它們被寫入。

printf("%c\n",*(&a-1)); 

由於您不擁有該內存,因此會調用未定義的行爲。這與任何一種「字號」無關。

如果要存儲一個序列的人物使用

const char *str = "Some text"; 

(或

char str[] = "Some text"; 
如果你要修改的序列

)在C或

std::string str = "Some text"; 

在C++ 。


好的,你的編輯更清楚你在說什麼。從你貼什麼報價:

4 ASCII字符,可以容納32位整數

char是不是32位整數。它通常是一個8位整數。您發佈的內容是談論類似

int32_t a = 'bcd'; 

(或可能uint32_t a)。現在a實際上是32位長,可以容納32位信息。但是,正如你已經報文中說,這因爲這樣分配的結果是完全依賴於實現的很少有用。

+4

它是C中有效的多字節字符常量。實際行爲是_implementation defined_。以下[答案](http://stackoverflow.com/a/7459943/586873)解釋說,在C++中也是如此。 –

+0

是@GrzegorzSzpetkowski多數民衆贊成多說,我想說[鏈接](http://stackoverflow.com/questions/7459939/what-do-single-quotes-do-in-c-when-used-on-multiple-characters/7459943#7459943) –

+0

@SandeepSinghRana但是你知道你的鏈接文章沒有使用'char'(但是是一個真正的4字節'int')? (並且它仍然是實現定義的) – deviantfan