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;
    }
4

3 回答 3

3

变量x, y and max已经是指针。所以你不需要&在 fscanf() 中使用 address-of。此外,如果调用者没有,您需要为它们分配内存。

只需使用:

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

并确保调用者为它们分配了内存。否则,使用malloc()

于 2012-04-04T01:52:30.707 回答
3

你有一个错误的地方:你不应该将 &x 或 &y 传递给scanf. 只需传递 x 和 y。

解释如下:

x 和 y,由函数的参数定义,是指向存储和 int 的内存位置的指针,即在 x 和 y 的内存空间上,有一个内存地址指示实际 int 的存储位置。

然后是地址运算符 (&)。该运算符为您提供参数的内存地址。

scanf通常要求一个内存地址,它将存储读取的值,因此通常当您有一个 int 变量(int i例如 )时,您使用 & ( &i) 为 scanf 提供其内存地址。但是在这种情况下,您不是在询问 int 的内存地址,而是在询问指针的内存地址。例如,如果您键入值“5”,那么它将存储在 y 上(同样,它是一个指针,而不是 int),然后,当您使用 *y 时,程序将尝试读取地址 5 上的内存很可能不是您的程序的有效地址(因此是分段错误)。

哇,在我说话的时候不给你画图,这真的很难解释,我希望你明白这一点。

于 2012-04-04T02:00:14.167 回答
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。

于 2012-04-04T02:29:01.620 回答