C 中的结构声明和定义
Structure declaration and definition in C
如果我们这样写:
typedef struct
{
unsigned int counter;
} MyStruct;
这代表结构声明?
声明说我们的编译器某处有一个结构,其参数类型和大小如上,并且在声明的情况下没有space在内存中为该结构保留。
定义是,现在我们在内存中为我们的结构保留了一个 space:
MyStruct tmpStruct;
还是我错了?
请用结构说明情况。
C 中有不同种类的定义 - 类型定义、变量定义和函数定义。类型和函数也可以在不定义的情况下声明。
您的 typedef
不是声明,它是 类型 的定义。除了定义一个没有标签的 struct
之外,它还定义了一个对应于 struct
.
的类型名称
struct
的声明如下所示:
typedef struct MyStruct MyStruct;
这样您就可以声明指向 MyStruct
、forward-declare 函数的指针,这些函数采用 MyStruct*
,等等:
void foo(MyStruct* p);
你有一个 declaration/definition 类型的变量 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;
}
这里有一篇很棒的文章
https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/
你声明的第一件事是类型声明和结构声明,没有定义所以没有 space 分配正确。
声明结构的正确方法是:
struct MyStruct
{
unsigned int counter;
};
您现在可以像这样定义一个实例:
struct Mystruct myVariableStructInstance = {1234}; // Define struct instance with initializer
也可以像这样将声明与定义结合起来:
struct MyStruct_t
{
unsigned int counter;
} MyStructVariable;
这将声明结构类型 (struct MyStruct_t) 以及 define/instantiate 一个名为 MyStructVariable
的结构变量
您现在可以将 MyStructVariable 传递给这样声明的函数:
void myFunction(struct MyStruct_t temp);
你可以简单地调用它
myFunction(MyStructVariable);
但实际上,阅读该博客 post,它所解释的远不止这些!
如果我们这样写:
typedef struct
{
unsigned int counter;
} MyStruct;
这代表结构声明?
声明说我们的编译器某处有一个结构,其参数类型和大小如上,并且在声明的情况下没有space在内存中为该结构保留。
定义是,现在我们在内存中为我们的结构保留了一个 space:
MyStruct tmpStruct;
还是我错了?
请用结构说明情况。
C 中有不同种类的定义 - 类型定义、变量定义和函数定义。类型和函数也可以在不定义的情况下声明。
您的 typedef
不是声明,它是 类型 的定义。除了定义一个没有标签的 struct
之外,它还定义了一个对应于 struct
.
struct
的声明如下所示:
typedef struct MyStruct MyStruct;
这样您就可以声明指向 MyStruct
、forward-declare 函数的指针,这些函数采用 MyStruct*
,等等:
void foo(MyStruct* p);
你有一个 declaration/definition 类型的变量 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;
}
这里有一篇很棒的文章
https://www.microforum.cc/blogs/entry/21-how-to-struct-lessons-on-structures-in-c/
你声明的第一件事是类型声明和结构声明,没有定义所以没有 space 分配正确。
声明结构的正确方法是:
struct MyStruct
{
unsigned int counter;
};
您现在可以像这样定义一个实例:
struct Mystruct myVariableStructInstance = {1234}; // Define struct instance with initializer
也可以像这样将声明与定义结合起来:
struct MyStruct_t
{
unsigned int counter;
} MyStructVariable;
这将声明结构类型 (struct MyStruct_t) 以及 define/instantiate 一个名为 MyStructVariable
的结构变量您现在可以将 MyStructVariable 传递给这样声明的函数:
void myFunction(struct MyStruct_t temp);
你可以简单地调用它
myFunction(MyStructVariable);
但实际上,阅读该博客 post,它所解释的远不止这些!