是什么导致C代码,动态分配累积功能中的分割故障



我试图动态分配结构数组并对它们执行操作,但我一直遇到分段故障。有人可以帮我吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void *malloc(size_t size);
typedef struct {
  double x;
  double y;
} coords;
struct figure {
  char fig_name[128];
  int coordcount, size_tracker;
  coords *pointer;
} fig;
void init_fig(int n, struct figure **point)
{
  printf("%un", sizeof(coords));
  point[n]->pointer = malloc(sizeof(coords) * 20);  <-------SEGFAULT
  if (point[n]->pointer == NULL){
    exit(-1);
  }
  point[n]->pointer[19].x = 2;
  point[n]->pointer[0].x = 1;
  point[n]->pointer[0].y = 2;
  point[n]->pointer[7].x = 100;
}
int main()
{
  int numfigs = 1;
  struct figure * point;
  point = malloc(sizeof(struct figure) * 16);
  point = &fig;
  point[1].coordcount = 1;
  init_fig(numfigs, &point);
  return 0;
}

我标记了第一个SEG故障的位置(使用的DDD)。我没有得到的是,我可以在主要功能中操纵点[1]。

我同意@maxim skurydin。尽管如此,我想在更多细节中解释您的错误。

读取您的init_fig一个人假设您传递的参数struct figure **point-实际上是Pointers 的数组到struct figure。此功能访问其n'TH元素。

但是,在您的main中,您会做其他事情。您将 struct figure数组分配给您的point变量指向其头部。然后,您取下此本地变量的地址并致电您的init_fig

这是问题。init_fig假设您将其传递给了一个指针数组,而实际上此"数组"仅由一个元素组成:main中声明的本地point变量。

编辑:

如何正确执行此操作。

  1. 离开main完整,修复init_fig

这意味着实际上有一个figure结构的数组。均值 - 单个内存块,被解释为随后结构的数组。

void init_fig(int n, struct figure *point)
{
  printf("%un", sizeof(coords));
  point[n].pointer = malloc(sizeof(coords) * 20);  <-------SEGFAULT
  if (point[n].pointer == NULL){
    exit(-1);
  }
  point[n].pointer[19].x = 2;
  point[n].pointer[0].x = 1;
  point[n].pointer[0].y = 2;
  point[n].pointer[7].x = 100;
}
  1. init_fig保留完整。修复main

这意味着我们实际上应该分配一系列指针,每个这样的指针都应指向分配的point结构。

int main()
{
  int numfigs = 1;
  struct figure ** point;
  point = malloc(sizeof(struct figure*) * 16);
  for (i = 0; i < 16; i++)
    point[i] = malloc(sizeof(struct figure));
  point[1].coordcount = 1;
  init_fig(numfigs, &point);
  return 0;
}

您分配内存并将指针存储在point中,但是当您为其分配&fig时,您会忘记该指针。

point = malloc(sizeof(struct figure) * 16);
point = &fig;

所以,您本质上是在尝试编写fig[1],这是没有意义的。

  struct figure * point;
  point = malloc(sizeof(struct figure) * 16);

这里的点是指向堆中16个结构的内存但是在下一行,您已经完成了此

  point = &fig;

因此,它的内存泄漏和点也不再指向该分配的区域

以及init_fig也应该像这样

void init_fig(int n, struct figure **point)

这是Segfault的问题

消除此行point = &fig;

并修改函数:

void init_fig(int n, struct figure *point)
{
  ...
  point[n].pointer = (coords*) malloc(sizeof(coords) * 20);
  ...
}

由于您应该通过一系列结构,而不是一系列指针。

另外,在init_fig函数中添加第三个参数,以便您可以传递要创建的点数的大小。喜欢:

void init_fig(int n, struct figure *point, int size)
    {
      ...
      point[n].pointer = (coords*) malloc(sizeof(coords) * size);
      ...
    }

因此,使功能更重复使用。

还要修改该功能的调用:

init_fig(numfigs, &point); to init_fig(numfigs, point);

相关内容

  • 没有找到相关文章

最新更新