1樓:紫薯蘿蔔
蔡傑答得很好了,其實就是淺拷貝和深拷貝的區別,char* a=b是淺拷貝,只有乙份副本,在你的問題中,這個副本在常亮區,char a=b是深拷貝,有兩個副本,乙個在常亮區,乙個在棧上。
2樓:蔡傑
char* p = "abcd";// line 1
這line 1,確實將p指向了常量區。
char p = "abcd";//line 2
這line 2,才是你所說的,在棧裡開闢了陣列空間。
因此,題主的第乙個問題,「既然*p不能改是因為指向了常量區」,這句話是沒錯的。
而題主的第二個問題,先不說new 的時候char(7)和char[7]的問題,
char * p = new char[7];// line 3
line 3,開闢了乙個長度為7的字元陣列,然後p作為乙個指標,指向了這個陣列的第0位。目前為止是沒有錯誤的。然後
p = "abcd";//line 4
line 4的效果等同於line 1,執行之後p指向了常量區。而你剛才new出來的陣列呢?呵呵,其實已經永遠找不回來了!!!也就是說,記憶體洩露了。此刻,你再
delete p;//line 5
至於line 5,很遺憾,此刻你要析構常量區?妥妥的報錯!我不明白題主的程式為什麼沒有崩潰,至少我這裡是崩潰了的。
環境VS,WIN7
我是分割線你看不粗來麼
好,現在我們跑到Ubuntu上去試一試gcc怎麼說
針對 char * p = "abcdabcdabcd";//line 6
char p = "abcdabcdabcd";//line 7
上述line6和line7這兩種情況,我們分別
gcc -m32 -O0 main.c
之後,來看一看它們彙編的區別:
80483c1: c7 45 f8 b0 84 04 08 movl $0x80484b0,-0x8(%ebp)
這是第一種情況,很顯然,把某個位址賦給了程式棧,好,那我們具體來看一看這個$0x80484b0是什麼鬼。
80484b0: 61
80484b1: 62 63 64
80484b4: 61
80484b5: 62 63 64
80484b8: 61
80484b9: 62 63 64
很明顯了,這不就是abcd這一串東西的ASCII麼(當然,是16進製制,0x61=97='a')
於是得到結論,line6這種情況,是棧裡有個指標,然後指標指向了常量區。
好了,回過頭來看line7這種情況:
8048421: c7 44 24 0e 61 62 63 movl $0x64636261,0xe(%esp)
8048428: 64
8048429: c7 44 24 12 61 62 63 movl $0x64636261,0x12(%esp)
8048430: 64
8048431: c7 44 24 16 61 62 63 movl $0x64636261,0x16(%esp)
8048438: 64
真的在棧裡把abcd這群東西寫進去了好麼!
C語言字串長度函式?
C語言答疑課堂 題主的問題有兩個地方需要回答 1.為什麼寫 c 100 會報錯?你看啊,陣列c定義的時候指定大小是100,這可不是意味著從1 100,而是0 99,C語言數字下標是從0開始的。對於我們來說,是不是有點不習慣?c 100 意味著第101個元素,這個元素並不在陣列裡,鬼才知道你是個什麼東...
C 中,使用範圍for語句改變字串中的字元時,引用為何能重新繫結?
tearshark 又乙個深受只有引用語義的語言毒害的青年。不過,即便只有引用語義的語言,內建的int之類的也是值語義啊。總之,先學c c 以外的語言,就是毒害無窮。連最基本的計算機工作方式都是稀里糊塗的。也就別指望能做出什麼貢獻了。碼農到30歲,回家賣白菜去吧! sin1080 C 的range ...
C語言,用陣列定義乙個字串,那這個字串是怎麼儲存在這個陣列中的呢?
the gc 對於scanf的 s的解釋如下 Matches a sequence of non white space characters the nextpointer must be a pointer to the initial element of acharacter array t...