函式 countSubstr(char* str, char* sub, int count) 內部修改 count,呼叫端 main 的變數仍為 0。改用 int* count 並傳 &count 後正常輸出 3。
malloc/new 動態分配,手動管理生命週期。void func(int count) { // 參數在棧區分配新 int,複製實參值
count = 3; // 修改副本
}
int main() {
int c = 0;
func(c); // 傳遞 c 的值 (0)
// c 仍為 0,因 func 操作的是棧區另一塊記憶體
}
void func(int* count) { // 參數為指標,複製實參的位址
*count = 3; // 透過位址修改原變數
}
int main() {
int c = 0;
func(&c); // 傳遞 c 的位址
// c 變為 3
}
C 語言只有值傳遞。若需在函式內修改實參變數,必須傳遞該變數的位址(指標)。這與「棧區銷毀」無關,純粹是「副本 vs 原始位址」的差別。
main 棧框: c @ 0x7FFE... → 值 0
func 棧框: count @ 0x7FFE... → 值 0 (副本)
*count (指標版) → 0x7FFE... (指向 main 的 c)
理解此機制,即可正確選擇何時使用指標參數。