全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:828
推到 Plurk!
推到 Facebook!

stuct 問題

尚未結案
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-07-17 16:51:15 IP:59.104.xxx.xxx 未訂閱
#include 
#include     #define MAX 30    struct GradeInfo{
  
  char pID[10]; //為什麼我這邊改成char *pID;編譯後的執行檔輸入ID後就發生錯
  int  Score[4];  
  float  FinalGrade;   
}ginfo[MAX];    int main(){
  
  
  int i=0 ;
  while(i   <30)
  {  
    
    printf("Enter ID: ");
    scanf("%s",ginfo[i].pID);
    printf("Enter four scores: ");
    scanf("%d %d %d %d", &ginfo[i].Score[0], &ginfo[i].Score[1], &ginfo[i].Score[2], &ginfo[i].Score[3]);
    ginfo[i].FinalGrade = (float)((ginfo[i].Score[0] ginfo[i].Score[1] ginfo[i].Score[2] ginfo[i].Score[3])/4);            getchar();
    
   
  }
        system("pause");
  return 1;   
}
char pID[10]; //為什麼我這邊改成char *pID;編譯後的執行檔輸入ID後就發生錯,使用pID[10]這沒問題 謝謝
GeorgeKu
中階會員


發表:1
回覆:120
積分:74
註冊:2004-10-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-07-17 18:24:37 IP:61.228.xxx.xxx 未訂閱
因為char* pID是一個指標變數,一開始你並沒有讓它指向一個有效的記憶體空間,因此會出錯.
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-07-17 19:18:47 IP:59.104.xxx.xxx 未訂閱
我是看書中範例 它使用char *pID;@@ 那是書寫錯了
syao
初階會員


發表:66
回覆:63
積分:25
註冊:2005-02-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-07-17 19:38:40 IP:59.104.xxx.xxx 未訂閱
照GeorgeKu大大說的char* pID是一個指標變數,一開始你並沒有讓它指向一個有效的記憶體空間    struct GradeInfo{      char *ID;    int  Score[4];     float  FinalGrade;    }test;    int main() {     test.ID="hello world!!";      cout<
psl
一般會員


發表:6
回覆:30
積分:7
註冊:2003-06-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-07-17 19:56:06 IP:220.143.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-07-17 20:54:01 IP:220.143.xxx.xxx 未訂閱
你的問題根據我追蹤的結果 從反組譯的程式碼可以解釋
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-07-18 01:05:07 IP:59.104.xxx.xxx 未訂閱
感謝psl你講的實在太好了 雖然追蹤部分那邊我看不太懂^^,不過前面的部份解釋非常清楚^^ 謝謝
系統時間:2024-05-18 7:05:48
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!