2012-07-03 65 views
1

在113頁,在C++編程語言 (第三版和特別版),斯特勞斯說:我可以初始化* char嗎?

struct address { 
char * name ; // "Jim Dandy" 
long int number ; // 61 
//... 
}; 

void f() 
{ 
address jd ; 
jd.name = "Jim Dandy"; // Is this possible? 
jd.number = 61 ; 
} 

這是可能的,因爲有沒有分配給JD的字符*領域的任何記憶?

更新:謝謝大家的回答!鑑於它不安全,我不會使用它。當我在書中看到它時引起了我的注意。

+0

如果「斯特勞斯指出:」這是可能的,這是絕對有可能:) – dasblinkenlight

+0

@dasblinkenlight:或者至少,這是可能的(但不建議使用)這本書是寫的時候。如果不添加'const',它在C++ 11中不應該是可能的。 –

回答

2

足夠的內存被分配來保存一個指針char,並分配設置指針指向一個靜態緩衝區保存字符串"Jim Dandy",所以是的,這是可能的。由於字符串未被複制,因此不需要分配。

(但是,設置一個char*到字符串文字已棄用;使用char const*代替)

+0

這不是爲字符串文字設置'char *'而已,這不是一種安全的做法,但即使如此,它也可以通過強制轉換來鍵入'(char [])'。 –

+0

@ RichardJ.RossIII:我的GCC抱怨從字符串常量到'char *'的不贊成使用的轉換。 –

+0

您運行的是哪個版本的GCC,以及您啓用了哪些編譯器標誌? –

2

存儲器被分配:足夠的指針。現在指向包含該字符串的靜態數組。

如果您期待它將字符串的副本放入結構中,那麼這不是C風格的字符串的工作方式;如果你想要這樣的行爲,那麼改用C++ std::string類。

我希望這個例子能解釋這是多麼危險。靜態數組是固定的,但語言的怪僻意味着您可以指定一個非const指針指向它。這允許你寫試圖修改常量對象,它在運行時給出了未定義行爲的代碼:

jd.name[0] = 'T'; // BOOM! Undefined behaviour. 

如果你幸運的話,編譯器會警告你的錯誤。您可以通過聲明的指針const防止它:

char const * name; 
... 
jd.name[0] = 'T'; // Gives a friendly compile-time error 
相關問題