Re: [問題] 指標的指標 與 二維的指標問題

看板C_and_CPP (C/C++)作者 (su35)時間16年前 (2009/06/13 23:47), 編輯推噓6(6015)
留言21則, 8人參與, 最新討論串3/3 (看更多)
我有個疑問 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

06/13 23:48, , 1F
這樣當然算 "good morning good morning\n" 在compile
06/13 23:48, 1F

06/13 23:48, , 2F
的時候會被賦予一個位址 所以ch1會得到這個位址
06/13 23:48, 2F

06/13 23:49, , 3F
你怎麼宣告 int* 結果給 char*?
06/13 23:49, 3F

06/13 23:51, , 4F
假設都是 char* 好了 你不如 char ch1[]="string";
06/13 23:51, 4F

06/13 23:51, , 5F
我寫錯了 那在指標的指標直接給"XXX"它不會自動給一個位址嗎
06/13 23:51, 5F

06/13 23:52, , 6F
這是特例喔~通常要先malloc才對
06/13 23:52, 6F

06/13 23:52, , 7F
直接存取 pointer 的習慣不太好 而且通常是 const
06/13 23:52, 7F

06/13 23:57, , 8F
這樣做,系統會配置一塊記憶體裡存這個字串,但是正如樓上
06/13 23:57, 8F

06/13 23:58, , 9F
所述,是一個const,所以只能讀不能寫,如果你做以下的事
06/13 23:58, 9F

06/13 23:58, , 10F
*ch1 = 'G'; /* 試著把第一個字元變大寫 */
06/13 23:58, 10F

06/13 23:59, , 11F
或許可以編譯,但執行時一定會發生記憶體錯誤
06/13 23:59, 11F

06/14 04:15, , 12F
打個嘴砲,實體記憶體位址想要存取,除非你退出保護模式吧...
06/14 04:15, 12F

06/14 04:16, , 13F
但只要Windows還在跑,就別想,重開機進去DOS還有可能
06/14 04:16, 13F

06/14 11:43, , 14F
可是為什麼小弟我記得WinDbg可以切到Phy Memory來R/W??
06/14 11:43, 14F

06/14 11:43, , 15F
只是沒有人知道這樣切過去到底會R/W到什麼東西就是XD
06/14 11:43, 15F

06/14 14:13, , 16F
可能是透過別的方法,但不是以前segment:offset這樣直接mov
06/14 14:13, 16F

06/14 14:13, , 17F
因為保護模式只要開著,Windows又多工,隨時都有程式需要跑
06/14 14:13, 17F

06/14 14:15, , 18F
也許是分頁表之類有紀錄對應,OS跟計組讀得有點爛,不太確定
06/14 14:15, 18F

06/14 22:49, , 19F
這篇給的是虛擬記憶體位址吧
06/14 22:49, 19F

06/14 22:51, , 20F
另外 win32 下也可以讀寫 physical mem 是沒錯啦
06/14 22:51, 20F

06/14 22:51, , 21F
透過 section object...
06/14 22:51, 21F
文章代碼(AID): #1ACye0LI (C_and_CPP)
文章代碼(AID): #1ACye0LI (C_and_CPP)