因此,我将C中的以下数组fib_sequence传递给函数*fib_sequence[]
当我通过执行以下操作访问元素时,我的函数会出错:

*fib_sequence[i]

不过,当我这样做的时候:
fib_sequence[0][i]

我是疯了还是不一样?
作为参考,这里是整个函数,当只分配给索引1时失败。
Segfault函数
void fib(int *fib_sequence[], int count) {
    *fib_sequence = malloc(sizeof(int[count]));

    for (int i = 0; i < count; i++) {
        if (i == 0) {
            *fib_sequence[i] = 0;

        } else if (i == 1) {
            *fib_sequence[i] = 1;

        } else if (i >= 2) {
            *fib_sequence[i] = *fib_sequence[i-2] + *fib_sequence[i-1];
        }
    }
}

工作功能
void fib(int *fib_sequence[], int count) {
    *fib_sequence = malloc(sizeof(int[count]));

    for (int i = 0; i < count; i++) {
        if (i == 0) {
            fib_sequence[0][i] = 0;

        } else if (i == 1) {
            fib_sequence[0][i] = 1;

        } else if (i >= 2) {
            fib_sequence[0][i] = fib_sequence[0][i-2] + fib_sequence[0][i-1];
        }
    }
}

最佳答案

它们并不等价,因为后缀运算符的优先级高于一元运算符。这意味着*fib_sequence[i]实际上意味着*(fib_sequence[i])然后通过正确理解的*(E)(E)[0]的等价性,这个表达式意味着(fib_sequence[i])[0],我们可以从中去掉不必要的括号来得到fib_sequence[i][0]
记住后缀与一元/前缀:*E++E&E和其他都是一元运算符E(...)E[]E->membE.memb是后缀。
所有一元和后缀都可以作为一个整体聚集在一起当postfix与postfix结合时,很明显:它们朝着一个方向,从左边的根表达式,向右:E[i]->foo.memb(arg)[blah]优先级完全相同,关联性显然只能从左到右。
一元组合时,同一事物的方向相反:sizeof (T) &*++E。优先级完全相同,关联性从右到左。所有这些都高于各种二进制运算符。
如果我们把这两个放在一起,我们几乎不必想:

sizeof (T) &*++E[i]->foo.memb(arg)[blah]

一旦我们扫过一元运算符找到E,优先情况就是:
sizeof (T) &*++ ( E[i]->foo.memb(arg)[blah] )
                ^---------------------------^

postfix cruft的优先级都高于一元cruft。
后缀的优先级最高,其次是一元,然后是其他所有内容。

10-04 13:43