2011-09-01 36 views
0

在獲取矩陣的縮減行梯形表格的程序開始時,我將用於打印數組的代碼轉換爲它自己的函數。只要我這樣做,我有段錯誤。但是,我感到困惑的是,一個無關的變量聲明(下面評論)解決了段錯誤。需要說明奇數for循環/範圍問題

#include <stdio.h> 


int COLS = 3; 
int ROWS = 3; 

void PrintArray(int array[][COLS]); 

int main (int argc, char**argv) { 

    int i, ii = 0; 

    FILE *file; 

    file = fopen(argv[1], "r"); 

    int array[ROWS][COLS]; 

    fscanf(file, "%d %d", &ROWS, &COLS); 

    while (!feof(file)) 
    { 
     fscanf(file, "%d", &array[i][ii]); 
     ii++; 
     if (fgetc(file) == '\n') { 
     i++; 
     ii = 0; 
     } 
    } 
    int j = 0, k = 0; //This solved the segfault. 
    PrintArray(array); 
    printf("\n"); 

    fclose(file); 
    return 0; 
} 

void PrintArray(int array[][COLS]) //The printing function 
{ 
    int j, k; 
    for (j = 0; j < ROWS; j++) 
     { 
     for (k = 0; k < COLS; k++) 
     { 
      printf("%d", array[j][k]); 
     } 
     printf("\n"); 
     } 
} 

經過幾個小時的調試,我最終發現它可能與for循環中的變量範圍有關。

舉例說明:

int COLS = 3; 
int ROWS = 3; 
int a; //declared globally 

//main 

    for (a = 0; a < ROWS; a++) { 
     printf("for loop"); 
    } 

作品,但只要我宣佈 「了」 主:

int COLS = 3; 
int ROWS = 3; 


//main 
    int a; //declared in main 
    for (a = 0; a < ROWS; a++) { 
     printf("for loop"); 
    } 

這是行不通的。另外,如果我用數字替換全局變量,我仍然會得到一個段錯誤,直到我刪除最初修復段錯誤的行!

void PrintArray(int array[][3]) //COLS 
{ 
    int j = 0, k = 0; 
    for (j = 0; j < 3; j++) //ROWS 
     { 
     for (k = 0; k < 3; k++) //COLS 
     { 
      printf("%d", array[j][k]); 
     } 
     printf("\n"); 
     } 
} 

這似乎是盡我所能理解的問題,所以你的幫助將不勝感激。

+0

從文件中讀取的ROWS和COLS的值是什麼? –

+0

它們是文件中的前兩個數字。正如Eugene指出的那樣,ROWS和COLS的值實際上並沒有改變,我沒有理解這一點,因爲我忘記測試3以外的值3. – AsianBorat

回答

1

您正在越過數組邊界。這兩個額外的變量緊挨着堆棧中的數組,所以你開始破壞它們而不是別的東西,這就是爲什麼segfault被「解決」(當然,這個錯誤還沒有解決)。

有嚴重的問題與該代碼:

  • 可變i使用沒有被初始化
  • array大小是3×3總是。讀取ROWSCOLS的新值不會調整陣列的大小。如果例如您已經從文件中讀取ROWS = 4和COLS = 4,則會損壞分配給array的內存以外的內存。
+0

我不敢相信我沒有看到。代碼現在可以工作,所以感謝您的幫助。 – AsianBorat