3

コードのどこかで、非常に悪いことをしています。実行時に極値変数で未定義の動作が発生しますが、ほとんどの場合、実行さえしません。どんな助けでも本当に素晴らしいでしょう。

#include <stdio.h>

void get_extrema(int quadrant, int **extrema)
{
  if (quadrant == 1)
  {
    *(extrema)[0] = 0;
    *(extrema)[1] = 90;
  }
  else if (quadrant == 2)
  {
    *(extrema)[0] = -90;
    *(extrema)[1] = 0;
  }
}

void print(int* arr)
{
      printf("%i",arr[0]);
      printf(",");
      printf("%i\n",arr[1]);
}

int main(void)
{
    int *extrema = (int*)malloc(2*sizeof(int));
    get_extrema(1,&extrema);
    print(extrema);
    get_extrema(2,&extrema);
    print(extrema);
}

また、次のようなポインター演算を使用して極値配列を編集してみました。

**(extrema) = 0;
**(extrema+1) = 90;

しかし、それもうまくいきませんでした。これがどこでうまくいかないのか、私には本当に手がかりがなく、本当に助けを借りることができます.

4

2 に答える 2

8

未定義の動作が発生する理由は、添字演算子[]が間接演算子よりも優先されるためです*。の値はextremaポインターの配列としてインデックス付けされますが、ポインターが 1 つしかないため、これは正しくありません。

ポインターにポインターを渡すため、アスタリスクを括弧内に入れる必要があります。

if (quadrant == 1)
{
    (*extrema)[0] = 0;
    (*extrema)[1] = 90;
}
else if (quadrant == 2)
{
    (*extrema)[0] = -90;
    (*extrema)[1] = 0;
}

ideone のデモ。

于 2013-08-20T15:27:53.313 に答える
1

a[b]は と同じ*(a + b)ですが、 よりも優先され*ます。(そして は と同じようa + bb + a、にa[b]等しいb[a]; と に5[a]等しいa[5])。

したがって:

*(extrema)[1] = 90;

// is equal to
*(*(extrema + 1)) = 99;

// When what you want to do is 
*((*extrema) + 1) = 99;

// which is of course equal to
(*extrema)[1] = 99;

ただし、さらに良い質問は、必要のないのに、なぜダブルポインターを使用しているのかということです。

void get_extrema(int quadrant, int *extrema)
{
    if (quadrant == 1)
    {
        extrema[0] = 0;
        extrema[1] = 90;
    }
    else if (quadrant == 2)
    {
        extrema[0] = -90;
        extrema[1] = 0;
    }
}

void print(int *arr)
{
     printf("%i,%i\n", arr[0], arr[1]);
}

int main(void)
{
    int *extrema = (int *)malloc(2 * sizeof (int));

    get_extrema(1, extrema);
    print(extrema);

    get_extrema(2, extrema);
    print(extrema);
}
于 2013-08-20T15:34:20.697 に答える