我正在尝试使用数组(malloc-ed)执行某些操作,即自定义结构的arr
。该数组通过函数的引用传递。每当我尝试在运行时对函数中除 arr[0]
以外的任何内容进行索引时,都会出现段错误(例如 (*arr[1])->i = 3;
)。为什么会发生这种情况?
完整的源代码是:
#include <stdio.h>
#include <stdlib.h>
#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 < SIZE; i++)
arr[i] = (foo*)malloc(sizeof(foo));
arr[1]->i = 1;
printf("Before %d\n",arr[1]->i );
doSomething(&arr);
printf("After %d\n",arr[1]->i );
return 0;
}
void doSomething(foo ***arr)
{
(*arr[1])->i = 3;
}
最佳答案
你的问题是线路
(*arr[1])->i = 3;
因为下标运算符的求值precedes解除引用的评估等效于以下内容:
(*(arr[1]))->i = 3;
这显然是错误的。你需要
(*arr)[1]->i = 3;
因此。
<小时/>注释:
- do not cast the result of
malloc
- 添加
#include <stdlib.h>
解决警告 - 添加额外的间接级别(
foo***
指向foo**
)是不必要的;只需按值复制 (除了上面的注释之外)一个好的旧一维数组实际上应该足以满足您的情况
调用
free
之后malloc
关于c - 尝试将指针索引到函数中的指针时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39739780/