结构的构造函数引用C中的其他结构

时间:2016-02-05 03:56:21

标签: c struct constructor

我是C的新手。在我的头文件中,我有两个结构。一个是由另一个构建的。

mylist.h:

#pragma once        
struct Node {
      void* data;
      struct Node *next;
};

typedef struct Node node;

struct List {
    Node* top;
};
typedef struct List* list;

我正在尝试构建构造函数。我有:

#include "mylist.h"
#include <stdio.h>
#include <stdlib.h>

static node data; 
static list l; 
stack newlist(){
    l->top->data = NULL;
    return l;
}

在Main中我像这样调用构造函数:

int main(){
    list m;
    m = newlist();
}

但它永远不会成为主要的。我马上得到一个段错误。我不明白为什么;我通过堆栈访问内容。我是否需要先为列表分配空间?我没有使用点运算符,因为列表是一个指针。

1 个答案:

答案 0 :(得分:1)

您需要先为l分配内存。这是因为list是指向结构的指针的typedef。因此,当您第一次声明l时,它只是一个指向无效内存的指针。尝试以下修改:

list newlist(){
    list l;
    l = malloc(sizeof(struct List));
    if (!l) {
        printf ("Error allocating memory (l)\n");
    } else {
        l->top = malloc (sizeof(struct Node));
        if (l->top) {
            l->top->data = NULL;
            return l;
        } else {
            // On failure to allocate top free memory and return NULL
            printf ("Error allocating memory (top)\n");
            free(l);
            l = NULL;  
        }
    }
    return l;
}

请注意,static list l移动到函数内部。您不需要其他静态全局data(除非您在未显示的代码的另一部分中使用它,在这种情况下,我会将其重命名为其他内容,以避免与staruct成员名称混淆)。 / p>

如果您还没有<stdlib.h><stdio.h>,则需要加入{。}}。

此外,您的结构定义需要一些更正,例如

struct Node {
    void* data;
    struct Node *next;
};
typedef struct Node node;

struct List {
    node* top;
};
typedef struct List* list;