C语言中关于字符串常量的进一步分析 转
請在(且只能在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!”;;這樣,在程序中就可以修改字符串了。試試下面代碼: ??? ?
這樣的代碼能夠在dev下面運行,而且看起來是修改了一個常量.
轉自:http://blog.csdn.net/andylyc/article/details/2046225
轉載于:https://www.cnblogs.com/Lyush/archive/2013/01/09/2852361.html
總結
以上是生活随笔為你收集整理的C语言中关于字符串常量的进一步分析 转的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PowerBuilder窗口之间传递多参
- 下一篇: Ch -- 一个 C/C++ 解释器