优先于*运算符
我的代码中的某个地方我做的非常糟糕。 我在我的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 + b
是b + 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); }