[英]what is causing segmentation fault in c code, dynamic allocation accross functions
我试图动态分配结构数组并对其执行操作,但是我一直遇到分段错误。 有人可以帮我吗?
#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;
}
我标记了第一个段故障发生的位置(已使用ddd)。 我没有得到的是我可以在main中操纵point [1],但不能在任何其他函数中操纵。
我同意@Maxim Skurydin。 不过,我想更详细地解释您的错误。
读取init_fig
假定您传递的struct figure **point
参数实际上是指向 struct figure
的指针数组 。 并且此函数访问其第n
个元素。
但是,您main
要做其他事情。 您分配一个struct figure
数组 ,您的point
变量指向它的头部。 然后,获取该局部变量的地址并调用init_fig
。
这是问题所在。 init_fig
假定你传递一个指针数组,而其实这个“数组”仅由单个元素:局部point
在声明的变量main
。
编辑:
如何正确执行此操作。
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;
}
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)
这是段错误的问题
消除该线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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.