[問題] 區域變數的問題

看板C_and_CPP作者時間11年前 (2015/01/25 10:05), 11年前編輯推噓1(105)
留言6則, 2人參與, 最新討論串1/1
修改後的程式如下 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) C ( 使用 Code-Blocks ) 問題(Question): 請教板上的大大們,我在寫排列組合時,使用 recursion 遇到區域變數的問題 下面有錯誤的程式碼 ps. debug 後,有找到錯誤的原因,但是無法理解 >"< ------------------------------------------ 程式錯誤原因: main() 裡面的 j 和 permutation 裡面的 i 會佔用相同的記憶體 導致 main() 的 for loop 形成 infinite loop ( 預期 main 裡面的 j 執行的狀況:0, 1, 2, 3, 跳出 for loop 實際 main() 裡面的 j 執行的狀況: 0, 1, 2, 1, 2, 1, 2.........) 目前解決的辦法: 將 main() 裡面的 local variable j 設成 global variable j 就可以解決 但是不知道為什麼不同 function 的變數會佔用相同的記憶體 我也沒有用 pointer 傳遞變數 >"< 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #define MAX 3 #define FLIP(x) ((x) == 0 ? (x = 1) : (x = 0)) void permutation(int arr[], int sub, int count, int index); int main(void) { int list[MAX] = {0}; int j; for(j = 0; j <= MAX; j++){ permutation(list, j, 0, 0); } return 0; } void permutation(int arr[], int sub, int count, int index) { int i; /* if(index > MAX) return; */ if(sub == count){ for(i = 0; i < MAX; i++) printf("%d ", arr[i]); printf("\n"); return; } if(index >= MAX) return; FLIP(arr[index]); permutation(arr, sub, count + 1, index + 1); FLIP(arr[index]); permutation(arr, sub, count, index + 1); } 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.231.62.58 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1422151550.A.D99.html

01/25 10:08, , 1F
index > MAX 這裡錯了, 宣告 [MAX] 的陣列只能存取 [MAX-1]
01/25 10:08, 1F

01/25 10:08, , 2F
存取 [MAX] 時會存取到不該取的位置, 你這裡正好被 j 使用
01/25 10:08, 2F

01/25 10:09, , 3F
所以在 FLIP 的時候就會寫入 1 或 0
01/25 10:09, 3F

01/25 10:09, , 4F
最後跳出迴圈時 j 就會以為它才剛數完 0
01/25 10:09, 4F

01/25 10:10, , 5F
所以它其實不是跟 i 一樣而是跟 [MAX] 一樣
01/25 10:10, 5F

01/25 11:25, , 6F
感謝大大啦,太強了~~~困擾我 1 個小時都還摸不著頭緒
01/25 11:25, 6F
※ 編輯: easyget (36.231.42.148), 01/30/2015 22:34:58
文章代碼(AID): #1Kn4z-sP (C_and_CPP)