如果我有结构:
typedef struct t_node {
char* id;
struct t_node* next;
}TypeNode;
如果我有这样的构造函数:
void conTypeNode(TypeNode* node, char* id) {
node = malloc(sizeof(TypeNode));
node->id = malloc(strlen(id)+1);
strcpy(node->id, id);
node->next = NULL;
}
那么这段代码就会出现错误:
void printTypeNode(TypeNode node) {
printf("%s\n", node.id);
}
int main(int argc, char* argv[]) {
TypeNode* head = NULL;
conTypeNode(head, "head");
printTypeNode(*head); //sig-fault 11: invalid read
}
有人可以解释为什么会这样吗?我知道如果我改变conTypeNode
的语法来获取双指针,那么它可以正常工作。我想也许是因为malloc
会更改存储在局部变量node
中的地址,而不会更改变量head
中的地址?
答案 0 :(得分:2)
void conTypeNode(TypeNode **node, char* id) {
*node = malloc(sizeof(TypeNode));
(*node)->id = malloc(strlen(id)+1);
strcpy((*node)->id, id);
(*node)->next = NULL;
}
...因为你必须返回分配的节点。
答案 1 :(得分:1)
在C
中,所有函数参数都按值传递 。即使指针被传递,被调用的函数也只获取其值(内存地址)及其副本,但是没有获得原始指针,因此它无法修改它。要做你想做的事,你需要将指针传递给像这样的指针:
void conTypeNode(TypeNode** node, char* id) {
*node = malloc(sizeof(TypeNode));
(*node)->id = malloc(strlen(id)+1);
strcpy((*node)->id, id);
(*node)->next = NULL;
}
TypeNode* head = NULL;
conTypeNode(&head, "aaa");
答案 2 :(得分:0)
请发布将编译的代码。 node->type
在哪里宣布?您的第二个参数在哪里传递给conTypeNode
?
任何费率,我可以在main
中看到head
为空。然后在转到head
时取消引用printTypeNode()
。
您无法取消引用NULL。
答案 3 :(得分:0)
原来,你所做的就是创建副本并将内存分配给那个而不是head
。所以,这是行不通的。 return
来自函数的指针。
你能做的就是这个 -
TypeNode *conTypeNode(char* id) {
TypeNode *node;
node = malloc(sizeof(TypeNode)); //allocate memory
node->id = malloc(strlen(id)+1);
strcpy(node->id, id);
node->next = NULL;
return node; //return pointer
}
在main
这样调用 -
head=conTypeNode("head");
并且不要忘记free
中的main
内存。