【问题标题】:allocating memory for structs为结构分配内存
【发布时间】:2016-01-27 05:09:50
【问题描述】:

如果我有一个结构:

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;
}

那么此代码将出现 sig-fault:

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

【问题讨论】:

  • @Haris,我的错,我修好了。我复制了一些代码并打算简化它。 sig-fault 与此无关。
  • 这段代码甚至无法编译,因为conTypeHead 需要两个参数,而不是一个。发布 SSCCE
  • conTypeNode 应该使用id 参数调用。
  • 停止更新问题中的代码!发布实际的。
  • @EugeneSh。有一些错误需要修复。

标签: c struct


【解决方案1】:
void conTypeNode(TypeNode **node, char* id) {
    *node = malloc(sizeof(TypeNode));
    (*node)->id = malloc(strlen(id)+1);
    strcpy((*node)->id, id);
    (*node)->next = NULL;
}

...因为你必须返回分配的节点。

【讨论】:

  • 所以您发布的代码是我实际使用的代码,带有双指针。这更像是一个健全性检查问题,我对为什么我的代码错误的解释是否准确?
  • 是的,你的解释是正确的。你的 node 在堆栈上,malloc 的结果被放入其中,当你返回时,堆栈已经消失了......因此,调用者看不到你所做的任何事情。
【解决方案2】:

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");

【讨论】:

    【解决方案3】:

    请发布可以编译的代码。 node->type 在哪里声明?你的第二个参数在哪里传递给conTypeNode

    无论如何,我可以在main 中看到head 为空。然后在传递给printTypeNode() 时取消引用head

    您不能取消对 NULL 的引用。

    【讨论】:

      【解决方案4】:

      最初,您所做的是创建副本并为其分配内存,而不是分配给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

      【讨论】:

        猜你喜欢
        • 2011-06-01
        • 1970-01-01
        • 2010-11-20
        • 2019-09-23
        • 2014-05-21
        • 2014-04-21
        • 2018-01-21
        • 2012-03-12
        相关资源
        最近更新 更多