C “如何修复”;请求成员‘;排名’;在非结构或联盟的事物中;?
我正在尝试用C创建一个结构数组,我想初始化它。C “如何修复”;请求成员‘;排名’;在非结构或联盟的事物中;?,c,pointers,struct,dereference,C,Pointers,Struct,Dereference,我正在尝试用C创建一个结构数组,我想初始化它。 但我得到了这个错误,我不知道如何修复它 int main(int argc, char **argv){ struct argnum{ int rank; char fileNamne[10]; }; void** argtab= malloc(sizeof(struct argnum)*(argc-1)); for(int i=0; i<argc-1; i++){
但我得到了这个错误,我不知道如何修复它
int main(int argc, char **argv){
struct argnum{
int rank;
char fileNamne[10];
};
void** argtab= malloc(sizeof(struct argnum)*(argc-1));
for(int i=0; i<argc-1; i++){
argtab[i]->rank=i;
argtab[i]->filename=argv[i];
}
}
为什么将argtab
声明为void**
?如果需要一个结构数组,则必须按以下方式声明:
struct argnum *argtab = malloc(sizeof(struct argnum) * (argc-1));
现在编译器知道,argtab
不仅仅是一个“字节包”,而是一个它知道其字段的结构
尽管允许,在函数中声明结构也是不寻常的。如果
argtab
的类型是void**
,那么argtab[i]
的类型是void*
,它不是指向结构或联合类型的指针
请注意,将argtab
的类型从void**
更改为struct argnum**
还不够好,因为除了分配argtab
之外,还必须分配每个argtab[i]
您最好将argtab
分配为
struct argnum *argtab = malloc( sizeof *argtab * (argc - 1));
然后使用
而不是->
访问每个成员:
argtab[i].rank = i;
由于每个
argtab[i]
将是类型struct argnum
,而不是struct argnum*
void*
不是结构类型;它从来没有任何成员。您需要一个struct argnum*
数组来使用argtab[i]->filename
符号;一个struct argnum
数组更合理,您可以使用argnum[i].filename
。您还应该修复fileNamne
和filename
以保持一致性。如果您将该类型用于argtab
,则对成员的访问权限需要是argtab[i]。秩
(点而不是箭头)。如果为struct argtab
(struct argnum**argtsb
)分配一个指针数组,那么当然也要为数组的元素分配内存。
struct argnum *argtab = malloc( sizeof *argtab * (argc - 1));
argtab[i].rank = i;