1. 程式人生 > >不建議使用從字串常量到‘char*’的轉換

不建議使用從字串常量到‘char*’的轉換

轉自https://blog.csdn.net/haoel/article/details/1395358

我相信,使用C/C++多年的人對下面這個字串賦值語句都不會陌生吧。

 

              char* p = "test";

 

同時,我也相信,各位在使用這種語句後吃過很多苦頭也不少吧?只要你想利用指標p來改變字串的內容,你的程式都會得到一個讓你顏面盡失一個記憶體非法操作。比如,下面的這些語句:

 

              p[0] = 's';

              strcpy(p, "haoel");

 

原因就在於,char* p = "test"; 這個宣告,聲明瞭一個指標,而這個指標指向的是全域性的const記憶體區,const記憶體區當然不會讓你想改就改的。所以,如果你一定要寫這塊記憶體的話,那就是一個非常嚴重的記憶體錯誤。另,之所以加粗“全域性const記憶體區”,是強調一下,如果你不信的話,你可以試試下面這段程式碼,看看p1和p2的地址是不是一樣的。

 

              char* p1 = "anything";

              char* p2 = "anything";

              printf(“ p1=%x, p2=%x /n”, p1, p2);

 

我想這應該是一個眾所周知的問題吧。取而代之的,應該是使用陣列來做初始化宣告。如:char str[] = “hello world”; 如果現在還有哪本書中的C的示例採用了使用const字串初始化指標的這種方式,那麼你就可以把那本書撕了,如果這本書是C++的書話,那麼你應該把這個作者和這個出版社告上法庭,因為你不應該容忍這種學術騙子。如果你的部門的開發人員還有人寫出這種程式碼的話,如果他是C程式設計師,我想你可以在打過他的屁股後告訴他下不為例,如果他是一個C++程式設計師的話,我想你可以懷疑他是否有資格做一個C++程式設計師了。

 

       至於你問我為什麼要對學C++的人那麼苛刻,那是因為學過C++的人都知道C++中的const關鍵字的有著什麼樣的權力,你也應該知道C++對const有著無比的照顧和關愛,幾乎所有關於C++的書都會提到const這東西。所以,如果作為一個C++的程式設計師來說,如果你不知道的話,那就太說不過去了。

 

       我們知道,雙引號引起來的字串是const的,所以,在C++的世界中,你應該進行如下的宣告才比較穩妥:

             

              const char *p = "test";

 

這樣,當你修改這個字串的內容時,編譯器會給你一個錯誤而導致你的程式編譯不通過,從而不會產生執行時的記憶體錯誤。

 

       可問題是,像C++這種對型別要求很嚴格的語言來說,為什麼它在編譯諸如char *p="test" 程式的時候不出錯,甚至連個警告都沒有(g++和vc++7)?難道這是他的一個bug?我想,這應該是對古老的C的一個向下相容。因為,在C的世界中,這種用法太多了。