制作动态 C 结构数组时出错
Errors when making a dynamic C array of structs
我有一个名为 Collection
的结构:
typedef struct collection {
char *type;
char *arg;
} *Collection;
而且我想要这个结构的动态数组(或者更确切地说,是指向这个结构实例的指针)。这是我试过的:
Collection *rawCollections = malloc(0);
int colCounter = 0;
while (i < argc) {
Collection col = malloc(sizeof(Collection));
// code to fill in Collection
rawCollections = realloc(rawCollections, sizeof(rawCollections) + sizeof(Collection));
rawCollections[colCounter] = col;
colCounter++;
}
我的理由是,每次我需要添加另一个数组时,我们都会将 sizeof(Collection)
添加到数组中。我收到这些错误,我不确定为什么:
realloc(): invalid next size
Aborted (core dumped)
您必须通过将数组元素的大小(指向 struct collection
的指针)乘以新的元素数 (colCounter + 1
) 来计算数组的新大小。
还要注意将指针隐藏在 typedef 后面是多么令人困惑:sizeof(Collection)
不是 结构的大小。
这是修改后的版本:
struct collection **rawCollections = NULL; // no need for `malloc(0)`
int colCounter = 0;
while (i < argc) {
struct collection *col = malloc(sizeof(*col));
// code to fill in Collection
rawCollections = realloc(rawCollections, sizeof(*rawCollections) * (colCounter + 1));
rawCollections[colCounter] = col;
colCounter++;
}
我有一个名为 Collection
的结构:
typedef struct collection {
char *type;
char *arg;
} *Collection;
而且我想要这个结构的动态数组(或者更确切地说,是指向这个结构实例的指针)。这是我试过的:
Collection *rawCollections = malloc(0);
int colCounter = 0;
while (i < argc) {
Collection col = malloc(sizeof(Collection));
// code to fill in Collection
rawCollections = realloc(rawCollections, sizeof(rawCollections) + sizeof(Collection));
rawCollections[colCounter] = col;
colCounter++;
}
我的理由是,每次我需要添加另一个数组时,我们都会将 sizeof(Collection)
添加到数组中。我收到这些错误,我不确定为什么:
realloc(): invalid next size
Aborted (core dumped)
您必须通过将数组元素的大小(指向 struct collection
的指针)乘以新的元素数 (colCounter + 1
) 来计算数组的新大小。
还要注意将指针隐藏在 typedef 后面是多么令人困惑:sizeof(Collection)
不是 结构的大小。
这是修改后的版本:
struct collection **rawCollections = NULL; // no need for `malloc(0)`
int colCounter = 0;
while (i < argc) {
struct collection *col = malloc(sizeof(*col));
// code to fill in Collection
rawCollections = realloc(rawCollections, sizeof(*rawCollections) * (colCounter + 1));
rawCollections[colCounter] = col;
colCounter++;
}