当前位置: 首页 > news >正文

结构体(二)

结构体的初始化:

#if 0 // 结构体的初始化// 初始化一个结构体变量
// 虽然正常,但是通常我们不这样用
struct Node
{int x;float y;char z;
}n={123, 456, 'z'}, n1={111, 222, 'h'};int main(int argc,char *argv[])
{// struct Node 是类型// n 是结构体变量struct Node n;printf("%d, %f, %c\n", n.x, n.y, n.z);printf("%d, %f, %c\n", n1.x, n1.y, n1.z);return 0;
}
#endif

// 常规用法
typedef struct Person // 如果使用了typedef, Person可以省略不写 
{
char name[255];
int age;
}PERSON; // 有typedef时,PERSON是类型名; 没有typedef时,PERSON是变量名。

int main()
{
// 两种常用的结构体变量声明方式
struct Person per1;
PERSON per;

    // struct p1; // error
// Person p2; // 在C语言中也是error

    // per.name = "ssss"; // error: 因为name是数组名,不可以这样操作
strcpy(per.name, "ssss"); // 如果结构体成员是字符数组,就只能使用strcpy来赋值
per.age = 18;

    printf("name = %s, age = %d\n", per.name, per.age);

    return 0;
}

#if 0typedef struct
{int* ptr;char* name;
}NODE;int main()
{NODE n;// 如果结构体中的成员是指针类型,通常在使用时需要先动态开辟内存n.ptr = (int*)malloc(sizeof(int) * 10); if (n.ptr == NULL){perror("n.ptr malloc fail");return -1;}n.name = (char*)malloc(sizeof(char) * 100); if (n.name == NULL){perror("n.name malloc fail");return -1;}strcpy(n.name, "yuanhoufeng");for (int i = 0; i < 10; i++){*(n.ptr+i) = i + 100;}printf("%s\n", n.name);for (int i = 0; i < 10; i++){printf("%d ", *(n.ptr+i));}printf("\n");if (n.ptr != NULL){free(n.ptr);n.ptr = NULL;}if (n.name != NULL){free(n.name);n.name = NULL;}return 0;
}#endif

#if 0

typedef struct
{
char* name;
}NODE;

int main()
{
// 如果定义了一个结构体指针变量,那么通常我们也是先动态开辟内存
NODE* n = NULL;

// 这段代码是让结构体的指针变量有了有效内存指向,与结构体成员变量没有关系
n = (NODE*)malloc(sizeof(NODE));
if (n == NULL)
{
perror("n malloc fail");
return -1;
}

    // 给指针类型的成员变量开辟内存
n->name = (char*)malloc(sizeof(char)*100);
if (n->name == NULL)
{
if (n != NULL)
{
free(n);
n = NULL;
}
perror("n->name malloc fail");
return -1;
}

    strcpy(n->name, "hahaha");
printf("%s\n", n->name);

    // 最后释放内存时,切记:需要先释放成员的堆内存,最后释放结构体的内存
if (n->name != NULL)
{
free(n->name);
n->name = NULL;
}

    if (n != NULL)
{
free(n);
n = NULL;
}

    return 0;
}

#endif

http://www.dtcms.com/a/282519.html

相关文章:

  • XXE漏洞1-XXE 漏洞简介-XML 语法-DTD 讲解-外部实体讲解
  • 【React Native】安装配置 Expo Router
  • HTML基础P1 | HTML基本元素
  • Jmeter中Parallel Controller的配置方法(并发)
  • 小白学HTML,操作HTML文件篇(2)
  • 二进制枚举
  • 基于Canal实现MySQL数据库数据同步
  • 百炼Agent MCP与IoT实战(二):阿里云MQTT Broker配置
  • Unity UGUI 无限循环列表组件
  • 倒立摆系统控制器设计报告
  • PyCharm(入门篇)
  • OpenSearch SQL 查询完整指南
  • Spring Boot 缓存 与 Redis
  • Java-74 深入浅出 RPC Dubbo Admin可视化管理 安装使用 源码编译、Docker启动
  • 【Android】TextView的使用
  • 【Fedora 42】Linux内核升级后,鼠标滚轮失灵,libinput的锅?
  • 颠覆NLP十年范式!OpenCSG中文数据集助推CMU无分词器模型登顶SOTA
  • Jetpack Compose 中 Kotlin 协程的使用
  • 重学SpringMVC一SpringMVC概述、快速开发程序、请求与响应、Restful请求风格介绍
  • 【iOS】源码阅读(六)——方法交换
  • Flutter基础(前端教程①①-底部导航栏)
  • 中医舌诊学习软件,图文视频详解
  • Flutter Web 的发展历程:Dart、Flutter 与 WasmGC
  • 2025华为ODB卷-箱子之字形摆放100分-三语言题解
  • 文字图标设计-色彩魔方:动态变色技术实现场景自适应 大学毕业论文——仙盟创梦IDE
  • 【Unity】Mono相关理论知识学习
  • 深入核心:理解Spring Boot的三大基石:起步依赖、自动配置与内嵌容器
  • Kafka——生产者压缩算法
  • IsaacLab学习记录(一)
  • opencv 值类型 引用类型