c 字串拷貝和記憶體問題?

時間 2021-06-03 07:24:17

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...