0

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

#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("%u\n", 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)。我没有得到的是我可以在 main 中操作 point[1] 但不能在任何其他函数中操作。

4

4 回答 4

1

我同意@Maxim Skurydin。不过,我想更详细地解释您的错误。

阅读您的init_fig假设您传递的参数struct figure **point- 实际上是指向的指针数组struct figure。这个函数访问它n的第 'th 个元素。

但是,在您的情况下,main您会做其他事情。你分配一个数组 struct figure,你的point变量指向它的头部。然后你获取这个局部变量的地址并调用你的init_fig.

这就是问题所在。init_fig假设您向它传递了一个指针数组,而实际上这个“数组”仅包含一个元素:pointmain.

编辑:

如何正确地做到这一点。

  1. 保持main原样,修复init_fig

这意味着实际上有一个figure结构数组。手段 - 单个内存块,解释为后续结构的数组。

void init_fig(int n, struct figure *point)
{
  printf("%u\n", 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;
}
于 2012-11-03T11:25:36.577 回答
0

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

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

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

于 2012-11-03T11:22:35.460 回答
0
  struct figure * point;
  point = malloc(sizeof(struct figure) * 16);

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

  point = &fig;

所以它的内存泄漏和点不再指向那个分配的区域

init_fig应该是这样的

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

这是段错误的问题

于 2012-11-03T11:25:00.213 回答
0

消除这条线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);
于 2012-11-03T11:28:01.900 回答