ошибка: неверное использование неопределенного типа структуры в C - PullRequest
0 голосов
/ 10 октября 2018

Я получил эту ошибку при компиляции в C:

error: invalid use of undefined type ‘struct block’
  blocks[0].i=1;
error: invalid use of undefined type ‘struct block’
  blocks[0].j=1;
error: invalid use of undefined type ‘struct block’
  blocks[0].k=1;

здесь мой код:

#include<stdlib.h>
#include<stdio.h>
void read_block(blocks);

int main()
{
        struct block
        {
                int i,j,k;
        } *blocks;

        blocks=malloc(sizeof(struct block));
        read_block(blocks);
        printf("primo val %d\n",blocks[0].i);
}
void read_block(struct block *blocks)
{
        blocks[0].i=1;
        blocks[0].j=2;
        blocks[0].k=3;


}

return(blocks);
}

Блоки определены, и они должны быть структурой.Так почему же компилятор их не видит?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Каждое имя, которое появляется в программе на C ++, допустимо только в некоторой, возможно, несмежной части исходного кода, называемой его областью действия.( ISO / IEC 9899: 2011 )

По сути, ваш struct виден только в пределах {}, в котором он заключен. В вашем случае эти скобкифункции main.За их пределами ваша структура не существует.

Попробуйте что-то вроде следующего:

struct block
{
   int i,j,k;
};
int main()
{
        block* blocks;

        blocks=malloc(sizeof(struct block));
        read_block(blocks);
        printf("primo val %d\n",blocks[0].i);
}
void read_block(struct block *blocks)
{
        blocks[0].i=1;
        blocks[0].j=2;
        blocks[0].k=3;


}

return(blocks);
}
0 голосов
/ 10 октября 2018

Так как вы определили их внутри main(), их область действия равна main().За пределами этого они не существуют.Чтобы исправить это, переместите объявление:

struct block
{
    int i,j,k;
};

int main()
{
    struct block *blocks;
    /* ... */

Также обратите внимание, что вам необходимо объявить типы в списке параметров объявления функции:

void read_block(blocks); /* bad */
void read_block(struct block *blocks);

Наконец, есть дополнительнаяreturn оператор в конце вашего кода, который препятствует компиляции этой программы.Я полагаю, что это просто опечатка при вставке кода по этому вопросу.

0 голосов
/ 10 октября 2018

Это о объеме .

Цитирование C11, глава §6.2.1,

Для каждого отдельного объекта, который обозначает идентификатор, идентификатор является видимым (т.е. может использоваться) только в пределах областитекста программы называется его объем.[...]

и

[...] Если декларатор или спецификатор типа, который объявляет идентификатор, появляется внутри блока или в списке объявлений параметровв определении функции идентификатор имеет область видимости блока, которая заканчивается в конце соответствующего блока.[...]

Вы определили struct block внутри функции main(), поэтому область действия ограничена этой функцией (т. Е. Заканчивается закрывающим } из main()).

Снаружи main(), struct block не имеет правильного определения.Итак, ваш компилятор жалуется.

Переместите объявление struct block за пределы main(), поместите его в область видимости файла.

...