2013-03-25 36 views
0

我有以下代碼:分段故障與二維數組

#define MAXSAMPLES 1024 
typedef int sample_t; 
typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES]; 

void blah(sample_t a[][MAXSAMPLES], int u0, int v0, int u1, int v1) { 
. . . . 
} 


int main(int argc, char *argv[]) { 
    sub_band_t in_data; 
    int k =0; 

    if (argc < 2) { 
     printf("\nInput filename required\n"); 
     return 0; 
    } 

    FILE *input_file = fopen(argv[1], "r"); 
    char del = '\0'; 

    int i = 0, j = 0; 
    int cols = 0; 
    sample_t x; 
    while (! feof(input_file)) { 
     if (fscanf(input_file, "%d%c", &x, &del) != 2) { 
      i--; 
      break; 
     } 
     in_data[i][j] = x; 
     if (del == '\n') { 
      i++; 
      j =0; 
      continue; 
     } 
     j++; 
     cols = j > cols ? j : cols; 
     x = 0; 
    } 
    blah(in_data, 0, 0, i, cols); 
} 

當我用10點* 10點的整數輸入文件中運行這個程序,我得到了blah函數調用分段錯誤主要。我不能也收集有關分段錯誤用gdb的任何信息,它只是說:

0x0000000000400928 in blah (a=Cannot access memory at address 0x7ffffdbfe198) at blah.c 

我在做什麼錯在這裏?任何幫助將不勝感激。

+5

如果崩潰的原因是來自blah函數,那麼爲什麼你不把它的代碼? – MOHAMED 2013-03-25 10:38:00

+0

'blah'中的哪條線導致崩潰?你在那兒做什麼?你改變'a'來指向別的嗎? – 2013-03-25 10:41:50

+0

崩潰發生在函數初始化之前,就在原型行。早些時候函數是可以的,但是我改變它將一個二維數組作爲參數,而不是雙指針。我猜測這個問題只與此有關,但不能指出。 – Dronacharya 2013-03-25 10:43:16

回答

1

您將typedef subband_t設置爲幾MB大二維數組。這將需要幾MB的堆棧內存。這是否是一個執行質量問題。程序段錯誤是否爲#define MAXSAMPLES 10?那就是你的問題。

並注意

while (! feof(input_file)) { ... } 

從來沒有工作過,也永遠不會因爲後EOF標誌只設的輸入操作打EOF。請參閱comp.lang.c常見問題解答。

+0

其實我在聲明更多的sub_band_t類型,所以堆棧內存的短缺將成爲問題。非常感謝你。 – Dronacharya 2013-03-25 11:58:42

1

你糊塗了的類型定義: 你沒:

typedef sample_t sub_band_t[MAXSAMPLES][MAXSAMPLES]; 
  • 編輯:

這裏有一個例子類似的問題: Create a pointer to two-dimensional array

所以看起來像typedef是正確的,它可能是在堆棧上分配這麼多的內存,它是否仍然分段當你將MAXSAMPLES定義爲10時 也就像他說的那樣有feof問題。 正如我評論,你的功能看起來接收6個參數,你只發送5 ..

+0

您建議的typedef給出錯誤:'錯誤:期望的標識符或'('''''之前'。'我從這裏拿起typedef:http://stackoverflow.com/questions/1052818/create-a-指針到二維陣列 – Dronacharya 2013-03-25 11:15:49