带嵌套结构指针的C segfault

带嵌套结构指针的C segfault,c,pointers,struct,segmentation-fault,C,Pointers,Struct,Segmentation Fault,我对C相当陌生,并试图更好地理解它,但我发生了一些奇怪的行为,我并不完全理解: 我有两个结构: typedef结构边缘 { int启动节点; int end_节点; }边缘; 类型定义结构图 { int节点计数; 边*边; }图形; 如果我现在初始化图形(分配内存): graph*g=malloc((sizeof(edge)*(edge_amount))+sizeof(int)); 如果我现在尝试初始化我的边,如: (调用函数parse_graph(g->edges);) void pars

我对C相当陌生,并试图更好地理解它,但我发生了一些奇怪的行为,我并不完全理解: 我有两个结构:

typedef结构边缘
{
int启动节点;
int end_节点;
}边缘;
类型定义结构图
{
int节点计数;
边*边;
}图形;
如果我现在初始化图形(分配内存):

graph*g=malloc((sizeof(edge)*(edge_amount))+sizeof(int));
如果我现在尝试初始化我的边,如: (调用函数parse_graph(g->edges);)

void parse_图(边*边){
对于(int i=0;i
我的边缘有一个断层。 但是,当我初始化图形(仅边)时,如下所示:

edge*g=malloc((sizeof(edge)*(edge_amount))+sizeof(int));
我调用parseInput(g)这样的函数,我没有得到segfault。
我肯定我忘了一些重要的事情,但我想不出来。这里我缺少什么?

首先,您为
图形分配的空间比结构的大小要多

其次,你的分配并没有按照你的想法进行。考虑一下分配后地址
g->edges
包含什么内容

还有一些结构打包问题您没有考虑

不管怎样,你需要做的是

g = malloc(sizeof(graph));
if ( !g ) {
    // error handling
}
g->num_edges = edge_amount;
g->edges = malloc(sizeof(edge)*edge_amount);
if ( !g->edges ) {
    // error handling
}