为结构

时间:2015-10-27 16:53:09

标签: c struct

如果我有结构:

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中的地址?

4 个答案:

答案 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内存。