[]优先于*运算符

时间:2013-08-20 15:24:00

标签: c undefined-behavior

在我的代码的某处,我做的事情非常糟糕。当我的extrema变量运行时,我会得到未定义的行为,但大部分时间它甚至都没有运行。任何帮助都会非常棒。

#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;

但这也不起作用。我真的不知道哪里出错了,我真的可以使用一些帮助。

2 个答案:

答案 0 :(得分:8)

您获得未定义行为的原因是下标运算符[]优先于间接运算符*extrema的值被索引为指针数组,这是不正确的,因为那里只有一个指针。

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

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

Demo on ideone.

答案 1 :(得分:1)

a[b]等于*(a + b),但优先级高于*。 (和a + b一样b + aa[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);
}