作者su35 (su35)
看板C_and_CPP
標題Re: [問題] 指標的指標 與 二維的指標問題
時間Sat Jun 13 23:47:04 2009
我有個疑問
int *ch1;
ch1="good morning good morning\n";
這樣算給它實體記憶體位址嗎 我一直以為這樣就算 而且這樣也能編譯執行
: 答: 簡單的說, 問題出在 pa 在還未有實體之前, 就對它存取.
: 以下的改法, 或許你看了就明白了.
: : #include <stdio.h>
: : #include <stdlib.h>
: : void main(void)
: : {
: : char **pa;
: : int i;
: /* 動態配置 3 個 (char *) 的 pointer 給 pa */
: pa = (char **)malloc(sizeof(char *) * 3);
: : *(pa+0)="BOOK";
: : *(pa+1)="YOU";
: : *(pa+2)="C++";
: : for(i=0;i<3;i++)
: : {
: : printf("%s\n",*(pa+i));
: : }
: /* malloc 過的記憶體要還給系統 */
: free(pa);
: : system("pause");
: : }
--
"◢██◣ 呼呼呼~ 為什麼…我這麼愛你…
↙操B跑車 " ,█◥◥◥ ˊ 對不起,他有車。 ˋ ◢██◣
▄◣ ◤ ◎ ◎ ◣◢██◣ˊ █◥◥◥▌
◣◥◣ ◥ ▼◤ ▉█◥◥◥ ◤ ▇ ▇◤
██████ ◣ ╲██◣ ▉◤ ▄ ▄ ◥ █▲◤
██◤▄◥█▃ ◢ █▃●╲ ◤╲█"█◤ g121630作 ◢ ◣ ◣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.174.31
1F:→ MOONRAKER:這樣當然算 "good morning good morning\n" 在compile 06/13 23:48
2F:→ MOONRAKER:的時候會被賦予一個位址 所以ch1會得到這個位址 06/13 23:48
3F:推 sunkill:你怎麼宣告 int* 結果給 char*? 06/13 23:49
4F:→ sunkill:假設都是 char* 好了 你不如 char ch1[]="string"; 06/13 23:51
5F:→ su35:我寫錯了 那在指標的指標直接給"XXX"它不會自動給一個位址嗎 06/13 23:51
6F:推 Laputaet3:這是特例喔~通常要先malloc才對 06/13 23:52
7F:→ sunkill:直接存取 pointer 的習慣不太好 而且通常是 const 06/13 23:52
8F:推 phterry:這樣做,系統會配置一塊記憶體裡存這個字串,但是正如樓上 06/13 23:57
9F:→ phterry:所述,是一個const,所以只能讀不能寫,如果你做以下的事 06/13 23:58
10F:→ phterry:*ch1 = 'G'; /* 試著把第一個字元變大寫 */ 06/13 23:58
11F:→ phterry:或許可以編譯,但執行時一定會發生記憶體錯誤 06/13 23:59
12F:推 zlw:打個嘴砲,實體記憶體位址想要存取,除非你退出保護模式吧... 06/14 04:15
13F:→ zlw:但只要Windows還在跑,就別想,重開機進去DOS還有可能 06/14 04:16
14F:→ VictorTom:可是為什麼小弟我記得WinDbg可以切到Phy Memory來R/W?? 06/14 11:43
15F:→ VictorTom:只是沒有人知道這樣切過去到底會R/W到什麼東西就是XD 06/14 11:43
16F:推 zlw:可能是透過別的方法,但不是以前segment:offset這樣直接mov 06/14 14:13
17F:→ zlw:因為保護模式只要開著,Windows又多工,隨時都有程式需要跑 06/14 14:13
18F:→ zlw:也許是分頁表之類有紀錄對應,OS跟計組讀得有點爛,不太確定 06/14 14:15
19F:推 UNARYvvv:這篇給的是虛擬記憶體位址吧 06/14 22:49
20F:→ UNARYvvv:另外 win32 下也可以讀寫 physical mem 是沒錯啦 06/14 22:51
21F:→ UNARYvvv:透過 section object... 06/14 22:51