2012-04-04 75 views
2

處理機器問題的某些代碼;我們剛剛開始使用指針等,所以我不太清楚哪裏出了問題。運行調試顯示它是行:for(i = 0; i < * y; i ++)拋出該錯誤,但我確信在for(j = 0; j < * x ; j ++)空間。任何幫助將不勝感激。獲取分段錯誤

int readImage(char* fileName, 
        int image[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE][NUM_CHANNELS], 
        int* x, 
        int* y, 
        int* max) 
    { 
     /* Variable declarations*/ 
     int i=0; 
     int j=0; 
     int k=0; 
     int num=0; 
     char c; 
     /* Opens file, skips first line*/ 
     FILE *input=fopen(fileName, "r"); 
     if(!input) 
      return -1; 
     do 
      c=getc(input); 
     while(c!='\n'); 
     /*Saves the x and y components into a variable */ 
     fscanf(input,"%d",&x); 
     fscanf(input,"%d",&y); 
     fscanf(input,"%d",&max); 
     /*Cycles through file, reading it into the array */ 
     for(i=0; i<*y;i++) 
     { 
      for(j=0;j<*x;j++) 
      { 
       for(k=0;k<NUM_CHANNELS; k++) 
       { 
        /*Takes input */ 
        fscanf(input, "%d",&num); 
        /*Stores into the array in the form of array[x][y][color] */ 
        image[j][i][k]=num; 
       } 
      } 
     } 
     /*Closes input */ 
     fclose(input); 
     return 0; 
    } 
+0

這是不夠的繼續。我們需要查看代碼的其餘部分。 – jwodder 2012-04-04 01:47:19

回答

3

變量x, y and max已經指針。所以你不需要在fscanf()中使用地址&。另外,如果調用者沒有,則需要爲他們分配內存。

只需使用:

fscanf(input,"%d",x); 
    fscanf(input,"%d",y); 
    fscanf(input,"%d",max); 

並確保內存由主叫方分配給他們。否則,請使用malloc()

+0

那麼在for循環中我應該只使用x? – rbonick 2012-04-04 01:55:17

+1

否。在for循環中,您想使用這些值。所以你應該分別使用* x,* y和* max。差異:x是一個指針,* x是x指向的值。 – 2012-04-04 01:56:46

3

你在那裏得到了錯誤的東西:你不應該通過& x或& y到scanf。只需傳遞x和y。

的解釋如下:

x和y,通過該函數的參數所定義的,是指向的存儲器位置上的x和y的存儲空間中存儲並INT,即,有一個存儲器指示實際int存儲位置的地址。

然後,存在運算符地址(&)。該運算符爲您提供參數的內存地址。

scanf通常要求一個內存地址的地方將存儲讀取的值,所以通常當你有一個int變量(比如int i,例如)你給scanf函數與&(&i)的內存地址。但在這種情況下,您並不是要求int的內存地址,而是要求指針的內存地址。例如,如果輸入值「5」,那麼它將被存儲在y上(這又是一個指針,而不是一個int),然後,當你使用* y時,程序會嘗試讀取地址5上的內存很可能不是您的程序的有效地址(因此分段故障)。

哇,這真的很複雜,沒有在你說出圖片的時候給我解釋,我希望你明白。

+0

我明白了。這部分代碼現在可以工作,多虧了你以及其他答案。非常感謝你! – rbonick 2012-04-04 02:06:55

+0

真棒!很高興有幫助。 – 2012-04-04 02:14:10

0

正如其他人所說,scanf()的論據需要是指針。 正如你已經有一組指針(X,Y和max)將它們傳遞給scanf()

所以當,而不是用你不需要取消引用它們的:


fscanf(input,"%d",&x); 
fscanf(input,"%d",&y); 
fscanf(input,"%d",&max); 

你應該使用:


fscanf(input,"%d",x); 
fscanf(input,"%d",y); 
fscanf(input,"%d",max); 

你說的錯誤就行了: for(i=0; i<*y;i++)

這是因爲騙子*y帳篷還沒有分配任何東西(至少在我們可以看到的代碼中)。 scanf()將被分配一個值&y,這將有丟棄的y原始值,然後您可以嘗試取消引用(即*y

如果第二scanf()拿起值,也就是說,1024,那麼你的for()循環將嘗試解除引用地址1024.