C語言中關於字串常量的進一步分析

來源:互聯網
上載者:User

請在(且只能在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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.