2014-03-19 21 views
6

這聽起來可能太瘋狂了,但我只是有一個想法。 In C爲什麼爲什麼char *可以在C中保存單個字符?

char *pc = 'H';  // single character 
char *ps = "hello"; // a string 

兩者都有效嗎?我的意思是爲什麼一個char*可以容納/引用一個字符以及一個以空字符結尾的字符串?

爲什麼沒有爲*pc生成警戒子句或編譯器錯誤,因爲char*未持有以空字符結尾的字符串?

我在Ideone檢查了它,並沒有得到任何警告。

+12

我不認爲'字符* PC =「H''做你的想法。 – clcto

+2

如果您嘗試過'printf(「%s」,pc);',可能會發生非常有趣的事情。可能是垃圾輸出或崩潰。 –

+0

聆聽您的警告或調高警戒級別。 –

回答

3
char *pc = 'H'; 

上述語句定義char *類型的pc這意味着它可以容納char類型的對象的地址。您正在使用字符H進行初始化 - 這是一種不同的類型。請記住,字符文字的類型爲int,並計算爲其ASCII碼中的字符代碼爲72。所以,上面的語句相當於

char *pc = 72; 

這是一個非法操作,編譯器應該向您發出警告(GCC中,使用標誌-Wall)。您不應該直接將地址分配給指針,因爲您不知道是否有權訪問內存地址。您應該使用address of運算符&來獲取對象的地址,然後將其分配給指針。

char *ps = "hello"; 

在上述語句中,字符串文字的計算結果爲一個指針到它的第一個元素。這個地址被分配到ps,它是相同類型的,即char *。但是,在字符串爲只讀在C但不是const合格的(不像C++),因此嘗試使用指針ps會在編譯器錯誤,但不確定的行爲,最有可能導致程序崩潰是由於段錯誤不會導致修改字符串常量。因此,你應該定義ps爲指針,以一個const object -

const char *ps = "hello"; 
10

可以保持char因爲有一個隱式轉換從charchar *(經由int),並且因爲sizeof(char *) >= sizeof(char)。儘管(從技術上講,它是未定義的行爲,因爲字符的文字數值不可能是指向char類型的有效指針地址),所以應該不是

在許多/大多數編譯器,這確實發出警示:

$ gcc -otest test.c 
test.c:5: warning: initialization makes pointer from integer without a cast 
3

char *pc = 'H'; 

'H'int將澆鑄爲char *,將被用於初始化pc,編譯器應該給出警告。

char *ps = "hello"; 

"hello"將計算爲它的基地址,這將在用於初始化ps

0

當我編譯使用克++上面的代碼行,得到以下的警告:

 
test-12.c:1:12: warning: initialization makes pointer from integer without a cast [enabled by default] 

編譯器執行幾個自動強制轉換到初始化pc

char - >int - >char*

你只需要注意編譯器警告來檢測異常操作,就像你正在嘗試。

相關問題