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);
并停止..段错必须在这里发生,但为什么?!
请帮助,解释并展示如何解决这个问题。谢谢。
答案 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指针。