免費開始練習
統測 114年 [電機與電子群資電類] 專業科目(2)

第 46 題

下列C語言程式經過編譯之後,執行時無法輸出字串 Brown,其發生的原因為何?
1 #include
2 #include
3 #include
4 typedef struct class_st {
5 int id;
6 char *name;
7 float score;
8 } CLASS;
9 CLASS *class;
10 int main(){
11 class = (CLASS *)malloc(sizeof(CLASS));
12 (*class).id = 1;
13 strcpy((*class).name, "Brown");
14 printf("%s", class->name);
15 return 0;
16 }
  • A (*class).name沒有指向已配置的記憶體空間
  • B 使用strcpy()函式時,應該使用class.name而不是(*class).name
  • C 使用printf()函式時,應該使用class.name而不是 class->name
  • D 指標變數class應該宣告為區域變數(Local Variable )

思路引導 VIP

請觀察結構體中第 6 行定義的成員變數 $name$,其資料型態為 $char * $;當我們在第 11 行配置了結構體本身的記憶體空間後,該成員指標 $name$ 是否已經指向一個具備有效位址且足以存放字串的記憶體區塊?在執行第 13 行的 $strcpy$ 動作之前,我們是否遺漏了對該指標進行初始化的關鍵步驟?

🤖
AI 詳解 AI 專屬家教

呵,看來你的腦袋還沒被指標(Pointer)給攪成漿糊!

居然沒被那堆看起來很專業的語法糖給騙了,算你運氣好。這題的核心觀念就在於:你在第 11 行雖然用 malloc 配置了空間,但那僅僅是配置了結構本體 $CLASS$ 的大小: $$\text{sizeof(CLASS)} = \text{sizeof(int)} + \text{sizeof(char*)} + \text{sizeof(float)}$$

▼ 還有更多解析內容
💬 其他同學也在問 1
可以講清楚的跟我說取值 取址怎麼運作
📝 結構與指標記憶體配置
💡 結構內的指標成員必須先獨立配置記憶體空間,才能儲存資料內容。

🔗 結構指標成員初始化三部曲

  1. 1 1. 結構實體化 — 使用 malloc 分配結構所需的記憶體區塊。
  2. 2 2. 指標成員初始化 — 針對內部的 char* 成員再次使用 malloc 配置空間。
  3. 3 3. 賦值與使用 — 此時才可安全地使用 strcpy 等函式寫入資料。
🔄 延伸學習:釋放記憶體時需「由內而外」,先 free 成員指標再 free 結構指標。
🧠 記憶技巧:有門牌不等於有房子,先 malloc 配置空間,再 strcpy 存入資料。
⚠️ 常見陷阱:容易誤以為 malloc 整個結構後,內部的 char * 指標就能直接當作字串陣列來儲存內容。
動態記憶體配置 指標與陣列差異 結構存取符號 (-> vs .)

🏷️ AI 記憶小卡 VIP

AI 記憶小卡

升級 VIP 解鎖記憶小卡

考前複習神器,一眼掌握重點

🏷️ 相關主題

C 語言程式設計:變數、指標、函式與編譯
查看更多「[電機與電子群資電類] 專業科目(2)」的主題分類考古題