获得分段错误

时间:2012-04-04 01:42:58

标签: c segmentation-fault

处理机器问题的某些代码;我们刚刚开始使用指针等,所以我不太确定哪里错了。运行调试显示它是行:for(i = 0; i< * y; i ++)抛出错误,虽然我确定错误中的错误也是错误的(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;
    }

3 个答案:

答案 0 :(得分:3)

变量x, y and max已经是指针。因此,您不需要在fscanf()中使用&的地址。此外,如果调用者没有,则需要为它们分配内存。

只需使用:

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

确保调用者为他们分配内存。否则,请使用malloc()

答案 1 :(得分:3)

那里你错了:你不应该将&amp; x或&amp; y传递给scanf。只需传递x和y。

解释如下:

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

然后,有地址 - 运营商(&amp;)。此运算符为您提供参数的内存地址。

scanf通常会要求一个内存地址来存储读取的值,所以通常当你有一个int变量时(比如说int i)你给scanf它的内存地址带&amp; (&i)。但在这种情况下,您不是要求int的内存地址,而是要求指针的内存地址。例如,如果你键入值“5”,那么它将存储在y(再次,它是一个指针,而不是一个int)然后,当你使用* y时,程序将尝试读取内容地址5上的内存很可能不是您程序的有效地址(因此会出现分段错误)。

哇,在我说话时没有给你画一张照片真的很难解释,我希望你明白这一点。

答案 2 :(得分: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.