Re: [問題] 字串指標內容

看板C_and_CPP作者 (Cary)時間13年前 (2012/05/05 17:15), 編輯推噓1(102)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《kingofsdtw (不能閒下來!!)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : dev_C++ : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 問題(Question): : char *a="abc" a的內容是啥? 堆疊空間的位址?還是"abc"? "abc"和所有的 string literal 都存在 rodata section, 這裡你就先當作在某個神奇的 address 就好了 (不在 stack). char *a 是 pointer to char, 他會指向 'a' 的位置. 至於 pointer 本身是變數, 會 allocate memory 來存他指向哪, 所以 &a 和 a 印出來是不一樣的東西. a 是 'a'的 address, &a 是 pointer 的 address. note. 因為 rodata section 是 read-only, 所以請用 const char *a 去指任何 string literal... : 餵入的資料(Input): : 預期的正確結果(Expected Output): : a=0x00FFABC : 錯誤結果(Wrong Output): : "abc" : 程式碼(Code):(請善用置底文網頁, 記得排版) : 補充說明(Supplement): : 除錯: : (1)int *ptr符合指標原則 : http://codepad.org/XcwhwwwL : *額外發現陣列名稱d[]={9,2}會指向自己 : 假設&d的位址是 0x000001 ,d則是0x000001,那9到底儲存在哪呢?指標有兩個儲存空間? int d[] = {9, 2}; 這段會 allocate 一段 memory 給 9 和 2. 然後 d 會記下自己有多長, 還有第一個元素 (此處為9) 在哪. 跟 pointer 不一樣的地方在於, 這裡並沒有 allocate 一個空間說 d 是指向 address of 9, 所以你問 d 的 address 是什麼並沒有實質意義. 在這裡標準定義, d 的內容為 9 的 address, &d 也是 9 的address. 差別在於 d 的型態是個 array (int [2]), &d 的型態為 pointer (int *). note. d 因為不能改變 address, 所以不需要 allocate 空間. 任何 d 都可以直接替代成 address of 9 (ex: d[1] = 0x000001 + 1) 此外跟 pointer 也不一樣, 至少他還多個長度的資訊. : (2)char b[]="abc" : http://codepad.org/wJRh0cqj : *發現&b[0]指向0x28ff3C,但是將&b[0]用printf("%s")輸出會是abc : *猜測%s接受的是位址,會從0x28ff3C位址一直讀到\0結束,而不是把0x28ff3c轉成字串 "abc" 在 C 你可以看做等同於一個 array 裡頭存的是 ['a', 'b', 'c', '\0'] 基本上 printf 是 format output, 他會幫你作很多轉換, %s 的做法就是一直印到 '\0' 為止. 要印 address 請記得用 %p. -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.249.167.231 ※ 編輯: hilorrk 來自: 111.249.167.231 (05/05 17:23)

05/05 17:47, , 1F
small bug: rodata才是read-only data是writable
05/05 17:47, 1F
感謝 nowar100 大大的指正~ data section 確實是 read-write 的

05/05 18:03, , 2F
感謝大大Q_Q/ 學到不少
05/05 18:03, 2F
※ 編輯: hilorrk 來自: 111.249.167.231 (05/05 22:10)

05/06 00:44, , 3F
一樓學長好久不見XD
05/06 00:44, 3F
文章代碼(AID): #1FfE-_0K (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FfE-_0K (C_and_CPP)