优先于*运算符

我的代码中的某个地方我做的非常糟糕。 我在我的extrema变量中运行时会出现未定义的行为,但大部分时间它甚至都没有运行。 任何帮助都会非常棒。

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

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

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

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

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

在ideone上演示。

a[b]等于*(a + b) ,但优先级高于* 。 (并且像a + bb + 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); }