因此,我在C中将以下数组fib_sequence
传递为函数*fib_sequence[]
。
通过以下方式访问元素时,我的函数出现段错误:
*fib_sequence[i]
但是当我这样做时它会起作用:
fib_sequence[0][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[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];
}
}
}
答案 0 :(得分:3)
它们不是等效的,因为后缀运算符的优先级高于一元运算符。这意味着*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] )
^---------------------------^
后缀分类的优先级都高于一元分类。
后缀的优先级最高, ,后跟一元,然后是其他所有后缀。
答案 1 :(得分:2)
您想知道一元*
和[]
具有不同的“优先级”,并且您的表情
*foo[1]
实际上被解析为
*(foo[1])
您需要在“首选项”上加上括号,以使其正常运行:
(*foo)[1]
请注意:在某些情况下,*p
并不等同于p[0]
,尽管它始终等同于*(p + 0)
(请在此处注意指针算法)。
因此,当p[0]
是函数指针时,您可能会发现p
拒绝编译,因为它不能参与指针算术。对于数据指针,*p
和p[0]
实际上并没有任何区别。
答案 2 :(得分:1)
*pointer
和pointer[0]
在C中完全相同。但这意味着*fib_sequence[i]
与fib_sequence[i][0]
相同,而与{{1} }(除非fib_sequence[0][i]
恰好是0)。 C中的后缀运算符都比前缀运算符具有更高的优先级。
答案 3 :(得分:0)
请注意,int *fib[]
被解析为int* (fib)[]
;即int*
的无界数组。您可能是说int (*fib)[]
:一个指向无界整数数组的指针。进行更改后,您的第一个示例no longer compiles(应按原样),但(*fib_sequence)[i]
和fib_sequence[0][i]
都可以(也应按原样)工作。
但是,*fib_sequence = malloc(sizeof(int[count]))
现在是一个错误,因为您无法分配数组值。这意味着您将不得不将malloc
移到函数之外,或者放弃int (*fib)[]
语法而改为使用int** fib
。