c - [] 优先于 * 运算符

标签 c undefined-behavior

在我的代码中某处我做了一些非常糟糕的事情。当我的极值变量运行时,我得到了未定义的行为,但大多数时候它甚至没有运行。任何帮助都会非常有用。

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

但这也不起作用。我真的不知道哪里出了问题,我真的需要一些帮助。

最佳答案

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

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

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

Demo on ideone.

关于c - [] 优先于 * 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18338966/

相关文章:

multithreading - 如何同步多线程 OpenGL 缓冲区访问?

c - c 中的 fputs() 换行行为

c - 在C中访问Excel工作表单元格属性

C 连接字符串额外空格

c - 为什么使用不在 UB 范围内的标识符而不是错误

c++ - 恒定时间访问是否​​意味着在某些时候是连续的内存?

c - 如何获取 SPNEGO/Kerberos session key - 并实现 HTTP 身份验证 :Negotiate on my own client

c - 映射区域的错误权限

c - 函数返回局部变量的地址,但仍在c中编译,为什么?

c - 严格来说,C标准有没有要求free一定要在malloc之后调用,不满足这个要求时又是怎么规定的呢?