在我的代码的某处,我做的事情非常糟糕。当我的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;
但这也不起作用。我真的不知道哪里出错了,我真的可以使用一些帮助。
答案 0 :(得分:8)
您获得未定义行为的原因是下标运算符[]
优先于间接运算符*
。 extrema
的值被索引为指针数组,这是不正确的,因为那里只有一个指针。
由于您要将指针传递给指针,因此需要将星号放在括号内:
if (quadrant == 1)
{
(*extrema)[0] = 0;
(*extrema)[1] = 90;
}
else if (quadrant == 2)
{
(*extrema)[0] = -90;
(*extrema)[1] = 0;
}
答案 1 :(得分:1)
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);
}