2012-04-04 73 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.