我在为图表分配节点时遇到问题。以下是我的标题中定义的结构:
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”......
答案 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
未定义,因此如果您将数据写入指向的位置,它可能会使程序崩溃。