【问题标题】:[] precedence over * operator[] 优先于 * 运算符
【发布时间】:2013-08-20 15:24:00
【问题描述】:

在我的代码中的某个地方,我正在做一些非常糟糕的事情。我的极值变量运行时出现未定义的行为,但大多数时候它甚至没有运行。任何帮助都会非常棒。

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

但这也不起作用。我真的不知道哪里出了问题,我真的可以寻求帮助。

【问题讨论】:

  • printf("%s",arr[0]);是可疑的。 %s 用于字符串。
  • @Bathsheba 好点。那是我复制时的错误。
  • @philaeton ;-) 那是少了一个 UB 点
  • @Bathsheba:- 这是一个可能的答案!!!我想你应该把这个作为答案发布!! :)
  • 你使用的是什么操作系统?

标签: c undefined-behavior


【解决方案1】:

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

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

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

Demo on ideone.

【讨论】:

  • 完美答案。非常感谢,已经做到了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-03-04
    • 1970-01-01
    • 2011-07-07
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多