我是C的新手。在我的头文件中,我有两个结构。一个是由另一个构建的。
#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();
}
但它永远不会成为主要的。我马上得到一个段错误。我不明白为什么;我通过堆栈访问内容。我是否需要先为列表分配空间?我没有使用点运算符,因为列表是一个指针。
答案 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;