创建结构体实例:
struct Point {
int x;
int y;
};
int main() {
// 创建结构体实例
struct Point myPoint;
// 访问和操作结构体成员
myPoint.x = 10;
myPoint.y = 20;
// ...
return 0;
}
在这个例子中,myPoint
是一个直接存储在栈上的结构体实例。结构体实例的生命周期由其所在的作用域控制,当离开这个作用域时,结构体实例会被自动销毁。
创建结构体指针
struct Point {
int x;
int y;
};
int main() {
// 创建结构体指针
struct Point *myPointPtr;
// 动态分配内存,并将指针指向分配的内存块
myPointPtr = (struct Point *)malloc(sizeof(struct Point));
// 检查内存分配是否成功
if (myPointPtr == NULL) {
fprintf(stderr, "内存分配失败\n");
return 1;
}
// 访问和操作结构体指针指向的成员
myPointPtr->x = 10;
myPointPtr->y = 20;
// 释放动态分配的内存
free(myPointPtr);
// ...
return 0;
}
在这个例子中,myPointPtr
是一个指向 struct Point
结构体的指针。通过 malloc
分配了一块动态内存,而 myPointPtr
指向这块内存。结构体指针允许在堆上动态分配内存,并在需要时手动释放。结构体指针的生命周期不仅受到其所在作用域的控制,还受到程序员手动释放内存的影响。
区别总结:
-
内存分配方式: 结构体实例在栈上分配内存,而结构体指针通常在堆上分配内存(使用
malloc
或其他动态内存分配函数)。 -
生命周期: 结构体实例的生命周期由其所在作用域控制,而结构体指针的生命周期可以通过手动释放内存来调整。
-
使用方式: 结构体实例可以直接访问成员,而结构体指针需要使用箭头运算符
->
访问其指向的结构体的成员。
选择使用结构体实例还是结构体指针取决于程序的需求和设计,以及对内存管理的要求。
struct ClientInfo *client_info = (struct ClientInfo *)malloc(sizeof(struct ClientInfo));