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被索引为一个指针数组,这是不正确的,因为那里只有一个指针。

由于您将指针传递给指针,因此您需要将星号放在括号内:

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),但优先级高于*。(并且 like a + bis b + a,soa[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 回答