C中的结构声明和定义

时间:2018-03-29 22:51:46

标签: c struct compilation declaration definition

如果我们写这样的话:

typedef struct 
{
    unsigned int counter;
} MyStruct;

这代表结构声明?

声明说我们的编译器某处有一个结构,其类型和大小的参数与上面类似,并且在声明的情况下,内存中没有为该结构保留空间。

和定义是,因为现在我们在内存中为我们的结构保留了一个空间:

MyStruct tmpStruct;

或者我错了?

请用结构说明情况。

2 个答案:

答案 0 :(得分:2)

C类型定义,变量定义和函数定义中有不同类型的定义。类型和函数也可以在没有定义的情况下声明。

您的typedef不是声明,而是类型的定义。除了定义没有标记的struct之外,它还定义了与struct对应的类型名称。

struct的声明如下:

typedef struct MyStruct MyStruct;

这将允许您声明指向MyStruct的指针,指向MyStruct*的前向声明函数,依此类推:

void foo(MyStruct* p);

您拥有的是MyStruct类型变量的声明/定义:

MyStruct tmpStruct;

以下是struct声明与其定义分开的完整示例:

#include <stdio.h>
// Here is a declaration
typedef struct MyStruct MyStruct;
// A declaration lets us reference MyStruct's by pointer:
void foo(MyStruct* s);
// Here is the definition
struct MyStruct {
    int a;
    int b;
};
// Definition lets us use struct's members
void foo(MyStruct *p) {
    printf("%d %d\n", p->a, p->b);
}

int main(void) {
    // This declares a variable of type MyStruct
    MyStruct ms = {a:100, b:120};
    foo(&ms);
    return 0;
}

Demo.

答案 1 :(得分:0)

在这里对此有很好的记录

https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/

首先声明的是类型声明和结构声明,没有定义,因此没有正确分配空间。

声明结构的正确方法是说:

   struct MyStruct
   {
      unsigned int counter; 
   };

您现在可以对实例进行如下定义:

   struct Mystruct myVariableStructInstance = {1234};  // Define struct instance with initializer

也可以将声明与这样的定义结合起来:

   struct MyStruct_t
   {
      unsigned int counter; 
   }  MyStructVariable;

这将声明结构类型(struct MyStruct_t),并为您定义/实例化名为MyStructVariable的struct变量

您现在可以将MyStructVariable传递到这样声明的函数中:

void myFunction(struct MyStruct_t  temp);

您只需拨打以下电话即可

myFunction(MyStructVariable);

但实际上,请阅读该博客文章,它解释的不仅限于此!