Как исправить «запрос на членство в ранге в чем-то, что не является структурой или объединением»? - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь создать массив структур в 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];
    }
}
Exercise2.c: In function ‘main’:
Exercise2.c:22:18: error: request for member ‘rank’ in something not a structure or union
     argtab[i]->rank=i;
              ^
Exercise2.c:23:18: error: request for member ‘filename’ in something not a structure or union
     argtab[i]->filename=argv[i];
              ^

Ответы [ 2 ]

1 голос
/ 22 сентября 2019

Если тип argtab равен void **, то тип argtab[i] равен void *, что не является указателем на тип структуры или объединения.

Обратите внимание, что при изменении типаargtab от void ** до struct argnum** недостаточно, потому что вам придется выделять каждый argtab[i] в дополнение к выделению argtab.

Возможно, вам лучше выделить argtab как

struct argnum *argtab = malloc( sizeof *argtab * (argc - 1));

, а затем использовать . вместо -> для доступа к каждому члену:

argtab[i].rank = i;

, поскольку каждый argtab[i] будет иметь тип struct argnum, а не struct argnum *.

0 голосов
/ 22 сентября 2019
void** argtab= malloc(sizeof(struct argnum)*(argc-1));

Почему вы объявляете argtab как void **?Если вам нужен массив структур, вы должны объявить его следующим образом:

struct argnum *argtab = malloc(sizeof(struct argnum) * (argc-1));

Теперь компилятор знает, что argtab - это не просто «мешок байтов», а структура, поля которой он знает.

Также необычно, хотя и разрешено, объявлять структуру внутри функции.

...