Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C “如何修复”;请求成员‘;排名’;在非结构或联盟的事物中;?_C_Pointers_Struct_Dereference - Fatal编程技术网

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++){

我正在尝试用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++){
        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;