我正在尝试使用数组(malloc-ed),即自定义结构的arr
。 通过引用函数传递数组。 每当我在运行时尝试索引除函数中的arr[0]
以外的任何东西时,我会得到一个段错误(例如(*arr[1])->i = 3;
)。 为什么会这样?
完整的源代码是:
#include #include #define SIZE 100 typedef struct{ int i; float f; }foo; void doSomething(foo ***arr); int main() { foo **arr = (foo**) malloc (SIZE * sizeof(foo*)); int i; for(i = 0; i i = 1; printf("Before %dn",arr[1]->i ); doSomething(&arr); printf("After %dn",arr[1]->i ); return 0; } void doSomething(foo ***arr) { (*arr[1])->i = 3; }
你的问题就在于此
(*arr[1])->i = 3;
由于下标运算符的评估先于解除引用的评估,因此它等同于以下内容:
(*(arr[1]))->i = 3;
这显然是错误的。 你需要
(*arr)[1]->i = 3;
因此。
笔记:
你得到的警告是因为你忘了#include
,所以没有声明malloc
,所以编译器假定它应该返回int
。 这可能会导致各种有趣的问题。 (你应该删除那些演员。)
另一个问题是这一行: (*arr[1])->i = 3;
后缀运算符(如[]
)绑定比前缀运算符更紧(如*
),因此*arr[1]
解析为*(arr[1])
。
您可以编写(*arr)[1]->i
来修复此问题,但事实certificate,您的函数实际上从未修改过*arr
,因此没有理由传递arr
(另一个arr
,主要的那个)的地址。 这样做:
void doSomething(foo **arr) { arr[1]->i = 3; }
并称之为doSomething(arr)
。
需要了解更多c/c++开发分享尝试将指针指向函数中的指针时的Segfault,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!
以上就是c/c++开发分享尝试将指针指向函数中的指针时的Segfault相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/980590.html