错误:在C中无效使用未定义类型的struct

时间:2018-10-10 13:55:22

标签: c function struct scope malloc

我在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 :(得分:3)

关于scope

引用C11,第6.2.1章,

  

对于标识符指定的每个不同实体,该标识符都是可见的(即可以是   仅在称为其作用域的程序文本区域内使用。 [...]

  

[...]如果声明符或类型说明符   声明标识符出现在一个块内或其中的参数声明列表中   函数定义,标识符具有块作用域,该作用域终止于   关联的块。 [...]

您已经在struct block函数中定义了main(),因此范围仅限于该函数(即,以}的结尾main()结尾)。

main()外,struct block没有有效的定义。因此,您的编译器在抱怨。

struct block的声明移到main()之外,并将其放入文件范围。

答案 1 :(得分:3)

由于您在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语句 您的代码,这将阻止该程序编译。一世 假设这只是在上面粘贴代码时的错字 问题。

答案 2 :(得分:1)

  

出现在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);
}