如果我们写这样的话:
typedef struct
{
unsigned int counter;
} MyStruct;
这代表结构声明?
声明说我们的编译器某处有一个结构,其类型和大小的参数与上面类似,并且在声明的情况下,内存中没有为该结构保留空间。
和定义是,因为现在我们在内存中为我们的结构保留了一个空间:
MyStruct tmpStruct;
或者我错了?
请用结构说明情况。
答案 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;
}
答案 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);
但实际上,请阅读该博客文章,它解释的不仅限于此!