2013-02-15 98 views
5

爲什麼不能正常工作?是否有可能做一些創造性的投射來使這個工作?鑄造初始化器到指針

1: const char* yo1 = "abc"; 
2: const char* yo2 = { 'a', 'b', 'c', '\0' }; // <-- why can't i do this? 
3: printf("%s %s\n", yo1, yo2); 

結果:分段故障

2號線沒有做什麼,我希望它做的事。

回答

5

你可以這樣做:

const char* yo2 = (char [4]) { 'a', 'b', 'c', '\0' }; 

這是有效的,並會實現你想要的。需要注意的是它不等同於:

const char* yo2 = "abc": 

在前者的情況下,當yo2在文件範圍聲明:化合物字面陣列具有靜態存儲持續時間,但是當yo2在塊範圍被聲明的化合物字面具有自動存儲時間。

在後一種情況下,​​是一個字符串文字,具有靜態存儲持續時間(文件範圍或塊範圍)。

你也可以使用一個數組,而不是指針:

const char yo2[] = { 'a', 'b', 'c', '\0' }; 

關於你的榜樣。在C:

const char* yo2 = { 'a', 'b', 'c', '\0' }; 

不是有效的並且你的編譯器將其解釋爲:

const char* yo2 = (char *) 'a'; 

'a'的值不是一個指針值(地址),以便解除引用yo2調用未定義的行爲。

+0

不! RHS是暫時的,它不保證一直保持。 – nneonneo 2013-02-15 23:53:08

+0

@nneonneo它是一個複合文字。如果在塊範圍聲明,它具有自動存儲持續時間。現在爲什麼downvote請? – ouah 2013-02-15 23:54:35

+0

在C中,是的。但是,只要在C++中使用它,或者在C++模式下編譯它就會變得不安全。所以在我的書中這不是一個安全的做法。 – nneonneo 2013-02-16 00:01:21