stuct 問題 |
尚未結案
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
#includechar pID[10]; //為什麼我這邊改成char *pID;編譯後的執行檔輸入ID後就發生錯,使用pID[10]這沒問題 謝謝 |
GeorgeKu
中階會員 發表:1 回覆:120 積分:74 註冊:2004-10-13 發送簡訊給我 |
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
|
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
|
psl
一般會員 發表:6 回覆:30 積分:7 註冊:2003-06-11 發送簡訊給我 |
syao 你好
char pID[10] 表示 pID 是一個擁有10個元素型態為 char 的陣列
但是 pID 其實是 char* 型態 指向那個陣列第一個元素的位址 char* pID; 則表示 pID 是一個指向 char 的指標
他只是一個指標 你沒初始化為 NULL 有潛在的危險 (使用指標真的要特別小心 ^_^)
他也沒有指向配置好的記憶體
所以你嘗試用 scanf 輸入時當然會出錯 scanf 後面要的是 "要填入的變數的位址" (記憶體空間已配置好)
所以這樣宣告 char pID[10]; 前面說過 這樣 pID 其實是位址 指向陣列的第一個元素
加這樣用scanf("%s",ginfo[i].pID); ginfo[i].pID 其實是位址而且有配置記憶體空間
是正確的 如果這樣宣告 char* pID;
型態對所以編譯得過
但是沒配置記憶體空間 且 pID 不知道指到哪裡去了
所以執行會出錯
或許你可以注意一下書上用 char* pID 時
是不是有先用 malloc() 配置記憶體 另外 既然你寫了
#define MAX 30
while 可以改成這樣 while(i++
|
psl
一般會員 發表:6 回覆:30 積分:7 註冊:2003-06-11 發送簡訊給我 |
你的問題根據我追蹤的結果
從反組譯的程式碼可以解釋
Unit1.cpp.13: test.ID="hello world!!"; 00401267 C705DC1D4400A480 mov [test],0x004380a4 <--只有一行 而且直接填入位址表示應該是已經存在記憶體中的囉? 從這個假設出發 利用一些工具 (我是用 Stud_PE,也可以用 dumpbin tdump) 在 .data 這個節區 (section) 可以看到 "hello world!!" 字串 (還有 "Borland C Copyright" 哈) 字串的篇移位址在 0xA4 其中 .data 的 VirtualOffset 是 0x38000 換算一下 根據一般 PE 的 ImageBase 從 0x00400000 開始的規則 ImageBase VirtualOffset 本身的 Offset 0x00400000 0x38000 0xA4 = 0x004380A4 0x004380A4 看到了嗎 就是上面那行紅色的記憶體位址 那個字串在程式執行後是存在於 位址 0x004380A4 的地方 (正確地說 起始位址) 因為 section 會映射到記憶體中 所以還是可以解釋的 只是需要一點努力跟時間 總結就是說 這樣的寫法 ID="hello world!!" > 關於 PE 檔的結構以及其他用到的技巧 請自行參考書籍吧 |
syao
初階會員 發表:66 回覆:63 積分:25 註冊:2005-02-02 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |