c - 尝试将指针索引到函数中的指针时出现段错误

标签 c arrays pointers

我正在尝试使用数组(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/

相关文章:

java - 应为 BEGIN_ARRAY,但在第 1 行第 53 列路径 $.data 处为 BEGIN_OBJECT

C++ 相同的字符串不相等(实际上是 char*)

与指针程序的混淆(c编程)

c++ - C API函数的风格

c - 从函数创建字符 vector

c - 排序二维数组c程序

python - C 中的字符串格式化

c - C中的动态字符串分配

比较两个不同类型的数组

c - 在 C 中初始化一个 char 指针。为什么被认为是危险的?