因此,我将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->memb
,E.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。
后缀的优先级最高,其次是一元,然后是其他所有内容。