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たとえば)がある場合は、scanfに&(&i)を使用してメモリアドレスを指定します。ただし、この場合、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) 。

2番目scanf()の値が1024などの値を取得した場合、for()ループはアドレス1024を逆参照しようとします。

于 2012-04-04T02:29:01.620 に答える