在结构数组的 malloc 处出现无效的初始值设定项编译器错误
Invalid initializer compiler-error at malloc of struct array
我正在尝试在我的程序初始化时将任意数量的字符串项读入结构数组。我想为
分配堆内存
当编译器到达下一行时,它会抛出一个 error: invalid initializer
。
我的代码的第一部分:
int main() {
printf("Work starts in the vineyard.\n");
typedef struct {
char* name[20];
unsigned int jobs;
}Plantation;
// read from list of plantations
FILE *plantationFile = fopen("./data/plantations.txt", "r");
if (plantationFile==NULL) {perror("Error opening plantations.txt."); exit(1);}
char line[20];
char *lp = line;
int plantationCount;
Plantation plantations[] = (Plantation *)malloc(sizeof(Plantation));
if (!feof(plantationFile)) {
int i = 0;
fgets(line, 20, plantationFile);
scanf(lp, "%i", &plantationCount);
realloc(plantations, sizeof(Plantation) * plantationCount);
while( !feof(plantationFile) ) {
fgets(line, 20, plantationFile);
strcpy(*(plantations[i].name), lp);
plantations[i].jobs = 1u;
++i;
}
}
...
我在这里错过了什么?
编译器输出:
$ gcc -W -Wall vineyard.c
vineyard.c: In function ‘main’:
vineyard.c:30:32: error: invalid initializer
Plantation plantations[] = (Plantation *)malloc(sizeof(Plantation));
^
如果我不进行类型转换,它也会抛出相同的错误。
$ gcc -W -Wall vineyard.c
vineyard.c: In function ‘main’:
vineyard.c:30:32: error: invalid initializer
Plantation plantations[] = malloc(sizeof(Plantation));
^~~~~~
谢谢!
您正在将 plantations
定义为一个数组,并且您正试图用一个指针来初始化一个数组。数组的初始值设定项必须是用大括号括起来的初始值设定项列表。更重要的是,虽然数组和指针是相关的,但它们不是一回事。
将plantations
定义为指针而不是数组:
Plantation *plantations = malloc(sizeof(Plantation));
此外,realloc
可以更改分配的内存指向的位置,因此您需要将 return 值分配回去:
plantations = realloc(plantations, sizeof(Plantation) * plantationCount);
您还应该检查 malloc
和 realloc
的 return 值是否有错误。
我正在尝试在我的程序初始化时将任意数量的字符串项读入结构数组。我想为
分配堆内存当编译器到达下一行时,它会抛出一个 error: invalid initializer
。
我的代码的第一部分:
int main() {
printf("Work starts in the vineyard.\n");
typedef struct {
char* name[20];
unsigned int jobs;
}Plantation;
// read from list of plantations
FILE *plantationFile = fopen("./data/plantations.txt", "r");
if (plantationFile==NULL) {perror("Error opening plantations.txt."); exit(1);}
char line[20];
char *lp = line;
int plantationCount;
Plantation plantations[] = (Plantation *)malloc(sizeof(Plantation));
if (!feof(plantationFile)) {
int i = 0;
fgets(line, 20, plantationFile);
scanf(lp, "%i", &plantationCount);
realloc(plantations, sizeof(Plantation) * plantationCount);
while( !feof(plantationFile) ) {
fgets(line, 20, plantationFile);
strcpy(*(plantations[i].name), lp);
plantations[i].jobs = 1u;
++i;
}
}
...
我在这里错过了什么?
编译器输出:
$ gcc -W -Wall vineyard.c
vineyard.c: In function ‘main’:
vineyard.c:30:32: error: invalid initializer
Plantation plantations[] = (Plantation *)malloc(sizeof(Plantation));
^
如果我不进行类型转换,它也会抛出相同的错误。
$ gcc -W -Wall vineyard.c
vineyard.c: In function ‘main’:
vineyard.c:30:32: error: invalid initializer
Plantation plantations[] = malloc(sizeof(Plantation));
^~~~~~
谢谢!
您正在将 plantations
定义为一个数组,并且您正试图用一个指针来初始化一个数组。数组的初始值设定项必须是用大括号括起来的初始值设定项列表。更重要的是,虽然数组和指针是相关的,但它们不是一回事。
将plantations
定义为指针而不是数组:
Plantation *plantations = malloc(sizeof(Plantation));
此外,realloc
可以更改分配的内存指向的位置,因此您需要将 return 值分配回去:
plantations = realloc(plantations, sizeof(Plantation) * plantationCount);
您还应该检查 malloc
和 realloc
的 return 值是否有错误。