Re: [問題] 字串指標內容
※ 引述《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
05/05 17:47, 1F
感謝 nowar100 大大的指正~ data section 確實是 read-write 的
→
05/05 18:03, , 2F
05/05 18:03, 2F
※ 編輯: hilorrk 來自: 111.249.167.231 (05/05 22:10)
→
05/06 00:44, , 3F
05/06 00:44, 3F
討論串 (同標題文章)