malloc()函数、结构体、共用体、枚举 2月1日学习笔记

一、malloc()函数

void* malloc(size_t size);

用于动态分配内存空间。

link = (int*)malloc(size(int)); //申请一段为int大小的内存空间。

int* p = (int*)malloc(sizeof(int)) 分配了一个 int 类型大小的内存空间,并将其起始地址赋给指针 p

malloc 分配的内存空间是在堆(heap)上。堆是程序运行时动态分配内存的一部分,与栈上的局部变量不同。堆上的内存需要手动管理,当不再需要时,应使用 free 函数释放已分配的内存空间,以避免内存泄漏。

malloc 返回的是 void 指针,这意味着它可以用来分配任何数据类型的内存空间。但是,分配的内存需要根据特定的数据类型进行强制类型转换以进行使用。例如,如果要分配一个整型数组的内存空间,可以使用 int* p = (int*)malloc(sizeof(int) * n),其中 n 是数组的大小。

#include <stdio.h>
#include <stdlib.h>int main() {int n;printf("请输入数组大小:");scanf("%d", &n);// 使用 malloc 在堆上分配整型数组的内存空间int* arr = (int*)malloc(sizeof(int) * n);if (arr == NULL) {printf("内存分配失败\n");return 1;}// 给数组赋值for (int i = 0; i < n; i++) {arr[i] = i + 1;}// 输出数组的元素printf("数组的元素为:");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");// 释放分配的内存空间free(arr);return 0;
}

 

二、结构体

语法:
struct 结构体类型名
{
   数据成员列表;
};
//定义了一个 "数据类型"  --- 用户自定义的数据类型 

//通常在函数外部声明结构类型,这样就可以被多个函数所使用了

结构体类型可以定义在函数内部,但这样结构体的作用域就只有这个函数内部了。

struct student
{//name char name[20]; //成员变量  各个成员变量之间 用分号隔开//ageunsigned char age;//0~255 -128~127//scorefloat score;//...
}; //注意: 最后这个分号(;) 表示 --- 结构体类型定义完成 
struct student s; //s为 自己定义的这种结构体类型的一个变量 

访问结构体:
  . //结构体成员运算符 
  
 结构体变量名.成员变量名 

在使用变量名访问时  用 . 

在使用指针访问时 用  ->
结构体类型的变量.成员变量名 
结构体类型的指针->成员变量名

struct date{
        int month;
        int day;
        int year;
    };
    struct date today;
    //赋值方法一
    today.month=07;
    today.day=31;
    today.year=2014;
    //赋值方法二
    struct date today={07,31,2014};
    //赋值方法三
    struct date thismonth={.month=7,.year=2014};
    //赋值方法四
    today=(struct date){07,31,2014} 
    //结构体可以  这种赋值操作         thismonth=today,

结构体的定义的形式:
//形式1 先定义类型,后定义变量 
struct stu
{
...
};

struct stu s;


//形式2 定义类型的同时定义变量
struct stu
{
...
}s1,s2,*s3,s4[10];

struct stu s;
 
//形式3 省略了类型名 --如果只用一次,可以这样写

struct 
{
...
}s1,s2,*s3,s4[10];

 

#include <stdio.h>
#include <stdlib.h>
struct student
{char name[20];int sno;float score;
};void inputStuInfo(struct student *p,int len)
{int i = 0;for (i = 0; i < len;++i){printf("name:");scanf("%s",(p+i)->name);printf("sno :");scanf("%d",&(p+i)->sno); //p[i].nameprintf("score:");scanf("%f",&(p+i)->score);}
}void outputStuInfo(struct student *p,int len)
{int i = 0;printf("%10s|%10s|%10s\n","name","sno","score");for (i = 0; i < len;++i){printf("%10s",p->name);printf("%10d",p->sno);printf("%10.2f\n",p->score);p++;}
}void printMenu(void)
{printf("-----Welcome Use Student info System-----\n");printf("1 选择输入的学生人数\n");printf("2 输入信息\n");printf("3 查看学生信息\n");printf("0 退出 \n");printf(">");
}
int main(void)
{int n;int len = 0;struct student *s;while (1){printMenu();scanf("%d",&n);switch(n){case 0:printf("exit----\n");return 0;case 1:printf(">");scanf("%d",&len);s = malloc(len*sizeof(struct student));break;case 2:inputStuInfo(s,len);break;case 3:outputStuInfo(s,len);break;}}return 0;
}

结构体在内存中存储的对齐规则

1.在32位的平台上,默认都是按4字节对齐的。  64位的平台 默认是8字节
2.对于成员变量,
   各自在自己的自然边界上对齐。
//整个结构体的对齐 
3.如果 成员变量中有比4字节大。  
  此时 整个结构体按照4字节对齐。  //32位的平台
4.如果 成员变量中没有有比4字节大。
  此时 整个结构体按照最大的那个成员对齐。

自然边界对齐 
int -- 4字节 --- 能被4整除的地址编号上 
short -- 2字节 --- 能被2整除的地址编号上 
char -- 1字节 --- 能被1整除的地址编号上 

三、共用体union(联合体)

union 共用体名
{
  成员列表; //各个变量 
}; //表示定义一个共用体类型 

1.共用体 
  初始化 --- 只能给一个值,默认是给到第一个成员变量的

共同体中属性赋值会损坏其他属性的值。
2.共用体成员变量辅助 
  共用体用的数据最终存储的 --- 应该是最后一次给到的值。
  但是只能影响到 自己数据类型对应的空间中的数据


3.可以判断大小端 
4.实际用途 
  a.节省空间 
  b.进行数据转换 
  192.168.1.169 //ip本质是个 32位的数值 
  
5.共用体的大小  --是成员变量中最大的那个成员的大小

共用体大小计算,不一定就等于最大成员;

 6.共用体类型可以是函数参数,也可以是函数返回值类型 

union{char a[3];char b;
} A ;  // sizeof(A) = 3union{char a[3];short b;
} B ;  // sizeof(B) = 4union{char a[5];int  b;
} C ;  // sizeof(C) = 8

和结构体对齐规则一样。 

int isEndian(void)
{union demo{int a;char b;}d;d.a = 1;return d.b;
}

返回1 小端存储, 返回0 大端存储。 

四、枚举 enum

枚举:一枚一枚的列举

如果一个变量只有几种可能的值,则可以定义为枚举类型。
  所谓“枚举”是指将变量的值一一列举出来,
  变量的值只限于列举出来的值的范围内。

注意:
1.枚举  提高了代码可读性 
2.枚举 本质上是int类型 
  枚举 与 整型 类型兼容 
3.不足
  因为枚举类型 --- 本质上是个整型类型,
  所以枚举类型的变量的值,并不能真正限定在指定的哪些值范围中  
4.枚举类型 
  可以做函数 形参 和 返回值 
  定义数组也可以,本质上就是整型数据 

 enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};

注意:第一个枚举成员的默认值为整型的 0,后续枚举成员的值在前一个成员上加 1。我们在这个实例中把第一个枚举成员的值定义为 1,第二个就为 2,以此类推。

enum season {spring, summer=3, autumn, winter};

没有指定值的枚举元素,其值为前一元素加 1。也就说 spring 的值为 0,summer 的值为 3,autumn 的值为 4,winter 的值为 5。

union MyUnion {int i;float f;char c;
};
union MyUnion u;u.i = 42;         // 将整数 42 存储在共用体中
printf("%d\n", u.i);  // 输出 42u.f = 3.14;       // 将浮点数 3.14 存储在共用体中
printf("%f\n", u.f);  // 输出 3.14u.c = 'A';        // 将字符 'A' 存储在共用体中
printf("%c\n", u.c);  // 输出 'A'
#include <stdio.h>
#include <stdlib.h>
int main()
{enum color { red=1, green, blue };enum  color favorite_color;/* ask user to choose color */printf("请输入你喜欢的颜色: (1. red, 2. green, 3. blue): ");scanf("%d", &favorite_color);/* 输出结果 */switch (favorite_color){case red:printf("你喜欢的颜色是红色");break;case green:printf("你喜欢的颜色是绿色");break;case blue:printf("你喜欢的颜色是蓝色");break;default:printf("你没有选择你喜欢的颜色");}return 0;
}

 请输入你喜欢的颜色: (1. red, 2. green, 3. blue): 1
你喜欢的颜色是红色 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/662857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

composer常用命令

查看全局配置信息 composer config -gl 设置镜全局像地址 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 去掉-g&#xff0c;即表示只有当前项目使用该镜像 批量安装composer项目依赖 composer install 执行该命令后&#xff0c;会读取当…

MySQL中where和having的区别

前言 数据库中的 WHERE 和 HAVING 子句在 SQL 查询中扮演着关键的角色&#xff0c;帮助我们有效地筛选和过滤数据。这两个子句虽然都用于限定结果集&#xff0c;但它们的应用场景和操作对象存在明显的区别。在理解和运用这两个子句的过程中&#xff0c;我们能够更灵活地进行数据…

golang sudog是什么?

sudog代表在等待队列中的goroutine&#xff0c;比如channel发送接受。由于goroutine和同步对象的关系是多对多&#xff0c;因此需要sudog映射 type sudog struct {// 指向的goroutineg *g// 指向前后sudog的指针next *sudogprev *sudog// 指向数据elem unsafe.Pointer // data…

【C语言】顺序表详解

目录 &#xff08;一&#xff09;顺序表是一种数据结构 &#xff08;二&#xff09;顺序表 &#xff08;1&#xff09;顺序表的必要性 &#xff08;2&#xff09;顺序表的概念及结构 i&#xff0c;线性表 &#xff08;3&#xff09;顺序表的分类 i&#xff0c;顺序表和…

Android SELinux:保护您的移动设备安全的关键

Android SELinux&#xff1a;保护您的移动设备安全的关键 1 引言 移动设备在我们的生活中扮演着越来越重要的角色&#xff0c;我们几乎把所有重要的信息都存储在这些设备上。然而&#xff0c;随着移动应用程序的数量不断增加&#xff0c;安全性也变得越来越关键。这就是为什么…

海洋鱼类检测7种YOLOV8NANO

【免费】海洋鱼类检测&#xff0c;7种类型&#xff0c;YOLOV8训练&#xff0c;转换成ONNX&#xff0c;OPENCV调用资源-CSDN文库 采用YOLOV8NANO训练模型&#xff0c;得到PT模型&#xff0c;然后转换成ONNX&#xff0c;供OPENCV的DNN调用&#xff0c;摆脱PYTORCH依赖&#xff0c…

SQL中聚合函数

SQL中的聚合函数是用于对一组值执行计算&#xff0c;并返回单个值的函数。它们通常在SELECT语句的SELECT列表中使用&#xff0c;并与GROUP BY子句结合使用来汇总数据。聚合函数忽略NULL值&#xff0c;只对非NULL值进行计算。以下是一些最常用的SQL聚合函数&#xff1a; 1. COU…

基于python的新闻爬虫

咱们这个任务啊&#xff0c;就是要从一个指定的网站上&#xff0c;抓取新闻内容&#xff0c;然后把它们整整齐齐地保存到本地。具体来说&#xff0c;就是要去光明网的板块里&#xff0c;瞅瞅里面的新闻&#xff0c;把它们一条条地保存下来。 首先&#xff0c;咱得有个网址&…

[python] os.waitpid

os.waitpid() 是 Python 中用于等待子进程改变状态的函数。这个函数是 os 模块的一部分&#xff0c;它提供了一个方式来收集子进程的状态信息&#xff0c;或者等待子进程结束。os.waitpid() 函数是 Unix/Linux 系统上的系统调用 waitpid() 的封装。 使用 os.waitpid() os.wai…

算法设计与分析实验:最短路径算法

一、网络延迟时间 力扣第743题 本题采用最短路径的思想进行求解 1.1 具体思路 &#xff08;1&#xff09;使用邻接表表示有向图&#xff1a;首先&#xff0c;我们可以使用邻接表来表示有向图。邻接表是一种数据结构&#xff0c;用于表示图中顶点的相邻关系。在这个问题中&am…

轻松打造智能化性能测试监控平台:【JMeter+Grafana+Influxdb】的优化整合方案

在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系统、应…

基于机器学习的无损缺陷检测技术研究进展

基于机器学习的无损缺陷检测技术是当前研究的热点之一&#xff0c;其应用广泛&#xff0c;可以有效检测各种材料表面的缺陷。近年来&#xff0c;随着机器学习技术的不断发展&#xff0c;越来越多的研究人员开始探索如何利用机器学习算法来进行无损缺陷检测。 机器学习算法在无…

C语言·贪吃蛇游戏(下)

上节我们将要完成贪吃蛇游戏所需的前置知识都学完了&#xff0c;那么这节我们就开始动手写代码了 1. 程序规划 首先我们应该规划好我们的代码文件&#xff0c;设置3个文件&#xff1a;snack.h 用来声明游戏中实现各种功能的函数&#xff0c;snack.c 用来实现函数&#xff0c;t…

探索Web3.0:下一代互联网的新篇章

随着技术的不断演进和社会的持续发展&#xff0c;我们正逐渐迈入Web3.0时代。Web3.0&#xff0c;作为下一代互联网的代名词&#xff0c;不仅仅是技术的进步&#xff0c;更是一种全新的数字化生态系统&#xff0c;其所带来的影响将深刻地改变着我们的生活、工作和交流方式。 什…

Java二维码图片识别

前言 后端识别二维码图片 代码 引入依赖 <dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.2.1</version></dependency><dependency><groupId>com.google.zxing<…

tuya-open-sdk-for-device使用体验之Windows 下 MSYS2 编译 T2-U 开发板

tuya-open-sdk-for-device 是一款跨芯片平台、操作系统的 IoT 开发框架。它基于通用南向接口设计&#xff0c;支持 Bluetooth、Wi-Fi、Ethernet 等通信协议&#xff0c;提供了物联网开发的核心功能&#xff0c;包括配网&#xff0c;激活&#xff0c;控制&#xff0c;升级等&…

2024美赛A题完整思路代码分析:建立竞争机理方程+遗传算法优化

A题是自由度比较大的场景限定下的模型构建&#xff0c;相对比较容易&#xff0c;核心是找到现有的成熟的数学模型&#xff0c;然后找到合适的数据进行证明得到结论&#xff0c;估计大部分是目标优化问题。&#xff08;不限制专业&#xff09; B题属于较为经典的物理建模&#…

【竞技宝】LOL:Able小炮连续起跳收割战场 OMG2-0轻取TT

北京时间2024年2月2日&#xff0c;英雄联盟LPL2024春季赛在昨天迎来第二周第四个比赛日&#xff0c;本日首场比赛由TT对阵OMG。本场比赛&#xff0c;TT在前中期和OMG有来有回&#xff0c;然而中后期的大龙团战始终不是OMG的对手&#xff0c;最终OMG2-0轻取TT。以下是本场比赛的…

linux vim 异常退出 异常处理 交换文件

交换文件 *.swp 格式 同时是隐藏的 如在vim一个文件&#xff0c; 在没有正常退出&#xff0c; 如直接断开连接 在次编辑这个文件 会出现下图的错误 解决方案&#xff1a; 直接删除这个交换文件即可 rm -fr .zen.txt.swp

11.29 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 比亚迪2024届秋招补录&#xff0c;内推码来袭&#xff01;&#xff08;上&#xff09; 校招 | 比亚迪2024届秋招补录&#xff0c;内推码来袭&#xff01;&#xff08;上&#xff0…