gpt4 book ai didi

c - 动态分配的结构数组中的段错误,C

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:37 26 4
gpt4 key购买 nike

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);

然后停止..段错误一定会发生在这里,但为什么呢?!

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

最佳答案

分配内存,然后更改指针

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 的更改。这意味着 create_FigArray 返回后存储在 fig_array 中的地址的动态内存与之前相同 - 它只是 copy 被函数改变了。如果你想改变指针,你需要使用一个双指针参数给函数,然后像

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

关于c - 动态分配的结构数组中的段错误,C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13223438/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com