2016-08-23 58 views
0

兩類聲明:C++字符串字面型和申報

char* str1 = "string 1"; 

char str2[] = "string 2"; 

我的編譯器不允許我使用第一次申報與爲const char一個錯誤 不正確的轉換[8] char *。看起來不錯, 這樣的版本:

const char* str1 = "string 1"; 

編譯通過。

請澄清我的理解。 我相信,如果我們宣佈兩個版本,例如在main()中, 第一個(const char *) - 唯一的指針將被分配到堆棧上並用數據段中的某個地址初始化。 第二個版本(char []) - 整個數組符號將被放置在堆棧上

據我所見,字符串常量現在總是有一個const char []類型。 是使用const char * depricated?僅用於C兼容?

其中每個版本將存儲字符串?

+3

C和C++是不同的語言!任何你期望他們表現完全一樣的理由?這不是關於C. – Olaf

+3

這很有趣,''string 1''是一個'const char [9]',而不是'const char [8]'。 – aschepler

+1

@aschepler不好笑 - 正常。有一個結尾的0字符組成了9 ... – Aconcagua

回答

2
char* str1 = "string 1"; 

這被棄用的C++ 98,並且不良形成爲C++ 11,作爲文字串不能被修改。修改它會導致未定義的行爲。

爲了避免這種情況,該標準禁止將其分配給修改char指針,因爲它可能以後無需程序員意識到他/她不應該修改它修改。

char str2[] = "string 2"; 

是的,這分配字符的陣列,而每個字符被存儲在棧上。

const char* str1 = "string 1"; 

這不會被棄用,這是推薦的方式(唯一方式),以分配字符串文本到char指針。這裏,str1指向const個字符,即它們不能被修改。因此,在某處使用它是安全的,因爲編譯器會強制執行,因此將永遠不會修改該文件。

這裏,str1存儲在堆棧中,指向一個字符串文字,它可能存儲在或不存儲在只讀存儲器中(這是實現定義的)。

+0

「'char * str1 =」string 1「;'C++ 11已棄用此代碼」否。這在C++ 98中已被棄用,並且從C++ 11開始是_ill-formed_。 – cpplearner

+0

@cpplearner感謝您的信息:) – Rakete1111

2

char str2[] = "string 2";

"string 2"是字符串文字const char[9]存儲在只讀存儲器中。

char str2[]將在讀寫內存中分配字符數組(大小從初始值大小中扣除)。

=將使用字符串文字來初始化char數組(執行"string 2"內容的memcpy)。

我的意思是原則上。通過優化生成的實際機器代碼可能會有所不同,通過比字符串文字中的memcpy更簡單的方式設置str2內容。

char* str1 = "string 1"; - 這裏您試圖獲取實際的字符串文字內存地址,但那一個是const,所以您不應該將其分配/轉換爲char *

const char* str1應該工作正常,從const char[]鑄造const char *是有效的(他們幾乎是同樣的事情,除非你在編譯過程中有機會獲得原始陣列大小,然後將鼠標指針變體是​​尺寸小於向上兼容版本)。

+0

所以版本const char *是一個真正的指向數據段中字符串文字的指針。第二個版本 - char []是剛剛從字符串文字初始化的數組,通過從右手邊值複製字符。這是對的嗎? – amigo421