C 使用可调整大小的数组初始化列表结构的正确方法

C 使用可调整大小的数组初始化列表结构的正确方法,c,pointers,memory-management,struct,malloc,C,Pointers,Memory Management,Struct,Malloc,我有一个结构的初始化,我一直得到一个分段错误:11 typedef struct { int id; double value; char* name; } Item; typedef struct { Item** items; int length; int capacity; } List; List* initList() { List* list = NULL; list->items = (Item**)mal

我有一个结构的初始化,我一直得到一个
分段错误:11

typedef struct {
    int id;
    double value;
    char* name;
} Item;

typedef struct {
    Item** items;
    int length;
    int capacity;
} List;

List* initList()
{
    List* list = NULL;
    list->items = (Item**)malloc(10 * sizeof(Item*));
    list->length = 0;
    list->capacity = 10;
    return list;
}
main.c
中,我得到了每个GDB的一个错误:

List* list = initList();
我无法初始化,我注意到,因为

list->items = (Item**)malloc(10 * sizeof(Item*));
我不熟悉C,但我确信我的
initList
函数将创建一个包含给定赋值的列表。我还有一个相应的函数来释放
初始列表中的
,问题在于:

List* list = NULL;
list->items = (Item**)malloc(10 * sizeof(Item*));
使用
NULL
值初始化
list
,然后取消引用
list
,而不给它另一个值。取消对
NULL
指针的引用将调用

您需要为
列表
分配内存。然后可以取消对其的引用:

List* list = malloc(sizeof(List *));
if (!list) {
    perror("malloc failed");
    exit(1);
}
list->items = malloc(10 * sizeof(Item*));
if (!list->items) {
    perror("malloc failed");
    exit(1);
}
另外,请注意,不要忘记检查错误。

问题在于:

List* list = NULL;
list->items = (Item**)malloc(10 * sizeof(Item*));
使用
NULL
值初始化
list
,然后取消引用
list
,而不给它另一个值。取消对
NULL
指针的引用将调用

您需要为
列表
分配内存。然后可以取消对其的引用:

List* list = malloc(sizeof(List *));
if (!list) {
    perror("malloc failed");
    exit(1);
}
list->items = malloc(10 * sizeof(Item*));
if (!list->items) {
    perror("malloc failed");
    exit(1);
}
另外,请注意,不要忘记检查错误。

list->items = (Item**)malloc(10 * sizeof(Item*));
问题不在右手边。问题在于,由于
list
指向
NULL
,因此将某些内容分配给它的某个字段是未定义的行为

您可以通过返回结构而不是指针来避免这种分配。不需要动态分配结构,它有一个固定的大小

List initList()
{
    List list;
    list.items = malloc(10 * sizeof(Item*));
    list.length = 0;
    list.capacity = 10;
    return list;
}
来电者:

List list = initList();
复制开销很小,但是不携带另一个动态分配的指针的好处很大。

in

list->items = (Item**)malloc(10 * sizeof(Item*));
问题不在右手边。问题在于,由于
list
指向
NULL
,因此将某些内容分配给它的某个字段是未定义的行为

您可以通过返回结构而不是指针来避免这种分配。不需要动态分配结构,它有一个固定的大小

List initList()
{
    List list;
    list.items = malloc(10 * sizeof(Item*));
    list.length = 0;
    list.capacity = 10;
    return list;
}
来电者:

List list = initList();

复制开销很小,但是不携带另一个动态分配的指针的好处很大。

List*List=NULL
您不分配
列表
结构,而是在下一行填充它。未定义的行为。
List*List=NULL;列表->项目=…
。您正在取消引用的
list
为空。在声明
list*list=NULL之后下一行
list->items=…
是一个
NULL
指针。
list*list=NULL
您不分配
列表
结构,而是在下一行填充它。未定义的行为。
List*List=NULL;列表->项目=…
。您正在取消引用的
list
为空。在声明
list*list=NULL之后下一行
list->items=…
是一个
NULL
指针。总是那么快。总是那么快。is
list list=NULL法律?我一直使用
memset
Is
List=NULL法律?我一直使用
memset