在为结构分配空间时程序崩溃

时间:2017-03-30 11:47:59

标签: c

我在为图表分配节点时遇到问题。以下是我的标题中定义的结构:

typedef struct Graph {
    struct Node**  _node_list;
    int                   _sz;
} Graph;

typedef struct Node {
    char    *code;
    char    **_outgoing_arcs;
    int     _sz;
} Node;

这是我的分配功能:

Graph* allocGraph(int sz)
{
    Graph *g;
    g = malloc(1000);
    g->_sz = 0; 
    return g;
}

Node* allocNode(char *c, Graph *g)
{
    Node *n;

    n = malloc(1000);
    strncpy(n->code,c,3); 
    g->_node_list[g->_sz] = n; 
    g->_sz += 1; 

    return n;
}

我可以很好地分配图形,但是当我尝试分配节点时,我的程序崩溃了。我没有正确地做strncpy吗?它总是需要输入字符串3长“ABC”,“FOO”......

2 个答案:

答案 0 :(得分:0)

节点

您的char指向的内存没有分配。

您的Node分配已经完成。 但是你的元素*code指向no-where或未定义的内存。

你必须另外为此分配内存,所以:

g->code = malloc(4);  //Allocate memory for 3 characters + 0 at the end.
strncpy(g->code, c, 3);

图形

另一个问题是在图表中为节点分配指针:

//Allocate memory for pointers. Array of pointers.
h->_node_list = malloc(max_number_of_nodes * sizeof(Node*))

对于两者而言,不要在你的情况下使用malloc(1000),而是使用:

g = malloc(sizeof Graph); //For graph
g = malloc(sizeof Node);  //For node

更好的方法是在分配后清除内存。

g = malloc(sizeof Graph); //For graph
memset(g, 0x00, sizeof Graph);

g = malloc(sizeof Node);  //For node
memset(g, 0x00, NodeGraph);

现在您的成员将被重置,您可以开始设置其他指针和分配。

答案 1 :(得分:0)

您正在为g->_node_list[g->_sz]分配值,但您没有为其分配内存。事实上,g->_node_list未定义,因此如果您将数据写入指向的位置,它可能会使程序崩溃。