SegFault在动态分配的结构数组中,C

时间:2012-11-04 22:08:00

标签: c struct segmentation-fault dynamic-allocation

typedef struct {
  double x;
  double y;
  long out_x;
  long out_y;
} coords;

typedef struct {
  char name[FIGURE_LEN + 1];
  int coordcount, size_tracker;
  coords *coordinate;
} fig;

fig figure;
fig * figpoint;

这是从parser.c源文件中调用的函数。

void initialize_fig(int n, char * name, double x, double y,
                         fig *fig_point)
{
  printf("inside function\n");
  strncpy(fig_point[n].name, name, FIGURE_LEN + 1);
  fig_point[n].size_tracker = 1;
  fig_point[n].coordinate = malloc(sizeof(coords) * fig_point[n].size_tracker);
  assert(fig_point[n].coordinate != NULL);
  fig_point[n].coordcount = 0;
  fig_point[n].coordinate[fig_point[n].coordcount].x = x;
  fig_point[n].coordinate[fig_point[n].coordcount].y = y;
}

void create_FigArray(fig * fig_point, int fig_size)
{
  fig_point = malloc(sizeof(fig) * fig_size);
  assert(fig_point != NULL);
  fig_point = &figure
}

我首先调用create_FigArray,就像这样...

create_FigArray(fig_point, 16);

我在这里没有任何段错误... 但后来我打电话给...

initialize_fig(0, Qe, 10.0000, 10.0000, fig_point);

参数实际上是通过变量传递的,但我只是想表明它们是正确的参数,并举例说明了传递的值。 无论如何,它命中

strncpy(fig_point[n].name, name, FIGURE_LEN + 1);

并停止..段错必须在这里发生,但为什么?!

请帮助,解释并展示如何解决这个问题。谢谢。

3 个答案:

答案 0 :(得分:1)

您分配内存,然后更改指针

fig_point = malloc(sizeof(fig) * fig_size); // allocate here
assert(fig_point != NULL);
fig_point = &figure;  // now you make fig_point point to something else

因此,您的fig_point指针不再指向动态分配的内存。如果你这样做

fig_point[n]

您正在访问内存或范围,因为figure不是数组。此外,您可以直接将指针fig_point传递给create_FigArray。这将创建指针的副本,因此您对该参数所做的任何更改实际上只是对copy的更改。这意味着fig_array返回后create_FigArray中存储的地址所返回的动态内存与以前相同 - 只是函数更改的copy。如果要更改指针,则需要对函数使用双指针参数,然后再使用

void create_FigArray(fig** fig_point, int fig_size)
{
    *fig_point = malloc(sizeof(fig) * fig_size);
}

答案 1 :(得分:1)

我不知道但是:

首先你将内存分配给fig_point:

fig_point = malloc(sizeof(fig) * fig_size);

然后你将图的地址分配给它,你不应该这样做。

fig_point = &figure;

你可以这样做:

figure = *fig_point;

答案 2 :(得分:1)

  • create_FigArray中你这样做:fig_point = malloc(sizeof(fig)* fig_size);然后这个: fig_point = &figure; //figure is a global variable and this causes a memory leak

  • 改为写下:

void create_FigArray(fig * fig_point, int fig_size)
{
  fig_point = malloc(sizeof(fig) * fig_size);
  assert(fig_point != NULL);
  fig_point = &figure;//Remove this line
}
  • 在您调用initialize_fig()或其他地方的函数中,请确保释放已分配的内存。

  • 在使用前将所有指针设为NULL,并在处理指针的函数中添加NULL参数检查,并在使用前检查NULL指针。