不要再直接用字串常量給字串指標初始化/賦值了
阿新 • • 發佈:2019-01-08
起因是我看別人程式碼發現了那麼一段程式,就是諸如
char *p ="abcde";
這樣的我之前是從來沒這樣初始化過的,所以還以為get到了新方法,後來一想不對。。。”abcde”應在常量儲存區,這個區的地址居然也能直接賦值?於是做了 如下探究
首先先看,p是否真的在常量儲存區
char *p = "Hello";
char *q = "Hello";
cout << (void *)p << " " << (void *)q << endl;
//注意這個地方一定要加(void *)因為如果不加,cout會直接輸出q的字串內容
q = "asdfsdafsadf";
結果發現輸出:01029B30 01029B30
兩個一樣的地址,說明都是常量儲存區中”Hello”的地址
但是為什麼常量儲存區的地址可以直接賦給一個非常量指標呢,我嘗試修改了一下p中的內容
*p = 'r';
結果一執行到這兒就崩潰了。所以說明其還是不能更改的,那為什麼還能這樣初始化或者賦值呢
找到了這篇文章 char *p=”1234567890”,這樣的定義有問題嗎?上面說,是因為歷史原因
由於歷史的原因,標準在這一點上作了一些“妥協”:既允許字元常量指標自動轉換為非常量指標。但是使用者應該知道這樣做存在著上述問題。因為這個原因,C++標準把這種轉換標記為“Deprecated”,應該避免使用。
所以以後應該給賦值給const型別才更嚴謹:
const char *p = "Hello";
剩下的用法和之前一樣