看板 C_and_CPP 關於我們 聯絡資訊
我有個疑問 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
MOONRAKER:這樣當然算 "good morning good morning\n" 在compile 06/13 23:48
MOONRAKER:的時候會被賦予一個位址 所以ch1會得到這個位址 06/13 23:48
sunkill:你怎麼宣告 int* 結果給 char*? 06/13 23:49
sunkill:假設都是 char* 好了 你不如 char ch1[]="string"; 06/13 23:51
su35:我寫錯了 那在指標的指標直接給"XXX"它不會自動給一個位址嗎 06/13 23:51
Laputaet3:這是特例喔~通常要先malloc才對 06/13 23:52
sunkill:直接存取 pointer 的習慣不太好 而且通常是 const 06/13 23:52
phterry:這樣做,系統會配置一塊記憶體裡存這個字串,但是正如樓上 06/13 23:57
phterry:所述,是一個const,所以只能讀不能寫,如果你做以下的事 06/13 23:58
phterry:*ch1 = 'G'; /* 試著把第一個字元變大寫 */ 06/13 23:58
phterry:或許可以編譯,但執行時一定會發生記憶體錯誤 06/13 23:59
zlw:打個嘴砲,實體記憶體位址想要存取,除非你退出保護模式吧... 06/14 04:15
zlw:但只要Windows還在跑,就別想,重開機進去DOS還有可能 06/14 04:16
VictorTom:可是為什麼小弟我記得WinDbg可以切到Phy Memory來R/W?? 06/14 11:43
VictorTom:只是沒有人知道這樣切過去到底會R/W到什麼東西就是XD 06/14 11:43
zlw:可能是透過別的方法,但不是以前segment:offset這樣直接mov 06/14 14:13
zlw:因為保護模式只要開著,Windows又多工,隨時都有程式需要跑 06/14 14:13
zlw:也許是分頁表之類有紀錄對應,OS跟計組讀得有點爛,不太確定 06/14 14:15
UNARYvvv:這篇給的是虛擬記憶體位址吧 06/14 22:49
UNARYvvv:另外 win32 下也可以讀寫 physical mem 是沒錯啦 06/14 22:51
UNARYvvv:透過 section object... 06/14 22:51