請在(且只能在TC2.0)中運行下面代碼,先不要看結果,想想會得到什麼:
#include<stdio.h>#include<stdlib.h>// 文章要求代碼在Tc下運行 int main(int argn, char* argv[]){ char* szStringA = "Hello,world!"; char* szStringB = "Hello,world!"; *szStringA = '-'; // dev下上面的語句在執行過程中異常退出,說明dev並不允許改變字串常量, dev下,如果查看szStringA 和 szStringB的值的話,這兩個指標的值話,也是一樣的 puts(szStringB); return 0;}
輸出結果是:"-ello,world!";。是否和你想象的結果不一樣呢?
ANSI C明確說明:修改字串常量,效果是未定義的。
首先我們得清楚,如何才能得到字串常量?只有一種方式:char* szString = “Hello,world!”;這個聲明得到一個字串常量。那麼char szString[] = “Hello,world!”;可以嗎?不可以!這樣得到的是字串變數。好了,回過來,由於ANSI C沒有要求編譯器實現者如何具體對字串常量進行處理,所以有些編譯器會把相同的多個字串常量看成一個(注意:這種最佳化僅有可能出現在字串常量中,不要把泛泛的用於其他類型的常量。如:int num1 = 11;int num2 = 11;雖然是兩個相同的常量,但是修改num1不會影響num2),目的是為了節約記憶體空間,所以上面的例子中,當修改字串a時,b也被修改了。從這裡可以看出,TC2.0有對字串常量進行最佳化,而其他的編譯器(如:DEVC++5.0)不一定也會最佳化,結果可能是無法通過編譯,或者通過編譯但是結果是垃圾值。由於這些種種不確定因素,我們應盡量避免修改字串常量。
如果必須修改字串就沒有辦法呢?有!一定有!請注意:我們要的效果是修改字元。因此,只需要定義字串變數,而不是字串常量。前面說過,可以用數組的方式定義char szString[] = “Hello,world!”;;這樣,在程式中就可以修改字串了。試試下面代碼:
#include<stdio.h> #include<stdlib.h> int main(int argn, char* argv[]){ char szStringA[] = "Hello,world!"; char szStringB[] = "Hello,world!"; // 這樣其實是聲明了一個數組大小由後面初始化常量決定的字元陣列變數 *szStringA = '-'; puts(szStringB); return 0;}
這樣的代碼能夠在dev下面運行,而且看起來是修改了一個常量.
轉自:http://blog.csdn.net/andylyc/article/details/2046225