C语言练习题

C语言练习题

文章目录

  • C语言练习题
    • 题目一
    • 题目二
    • 题目三
    • 题目四
    • 题目五
    • 题目六
    • 题目八

题目一

#include <stdio.h>
//VS2022,默认对齐数为8字节
union Un
{short s[7];int n;
};int main()
{printf("%zd", sizeof(union Un));return 0;
}

代码运行结果:>
16

sizeof计算的是联合体的大小,联合体的大小并不是联合体成员中最大的那个,联合体也是有对齐的
在上述代码中,联合体中有两个成员,short s[7],占14字节对齐数为1,int n,和short s[7],共用空间,对齐数为4,14字节并非联合体中最大对齐数4的整数倍,所以将对齐至16字节

题目二

#include <stdio.h>
//VS2022,默认对齐数为8字节
typedef struct {int a;char b;short c;short d;
}AA_t;int main()
{printf("%zd", sizeof(AA_t));
}

代码运行结果:>
12

上述问题设计结构体内存对齐

  1. 结构体第一个成员对齐至偏移量为0的位置
  2. 其他成员按照取默认对齐数与改成员的大小的较小值对齐,且对齐至整数倍
  3. 结构体的总大小为最大对齐数的整数倍
    在这里插入图片描述
    在上述代码中
    a 为结构体第一个成员位于偏移量为0的位置,且占4个字节
    b 的大小为1字节,默认对齐数为8,取较小值1,取对齐数1的整数倍,也就是偏移量为4的位置,占1个字节
    c 的大小为2字节,默认对齐数为8,取较小值2,取对齐数2的整数倍,也就是偏移量为6的位置,占2个字节
    d 的大小为2字节,默认对齐数为8,取较小值2,取对齐数2的整数倍,也就是
    偏移量为8的位置,占2个字节
    总大小为10字节,10字节不是最大对齐数4的倍数,对齐至12字节

题目三

#include <stdio.h>
#pragma pack(4)
/*编译选项,表示4字节对齐 平台:VS2022。语言:C语言*/
//假设long 是4个字节
int main(int argc, char* argv[])
{struct tagTest1{short a;char b;long c;long d;};struct tagTest2{long a;short b;char c;long d;};struct tagTest3{short a;long b;char c;long d;};struct tagTest1 stT1;struct tagTest2 stT2;struct tagTest3 stT3;printf("%zd %zd %zd", sizeof(stT1), sizeof(stT2), sizeof(stT3));return 0;
}
#pragma pack()

代码运行结果:>
12 12 16

#program是用于修改默认对齐数

#program pack(4)  //修改默认对齐数
#program pack( )  //取消设置的对齐数,还原为默认对齐数

stT1
在这里插入图片描述

第一个成员a位于偏移量为0的位置
第二个成员b的大小为1字节,默认对齐数为4,取较小值1,对齐至1的整数倍,也就是偏移量为3的位置
第三个成员c的大小为4字节,默认对齐数为4,取较小值4,对齐至4的整数倍,也就是偏移量为4的位置
第四个成员d的大小为4字节,默认对齐数为4,取较小值4,对齐至4的整数倍,也就是偏移量为8的位置
总大小为12字节,为最大对齐数4的整数倍,所以stT1的大小为12字节

stT2
在这里插入图片描述
第一个成员a位于偏移量为0的位置
第二个成员b的大小为2字节,默认对齐数为4,取较小值2,对齐至2的整数倍,也就是偏移量为4的位置
第三个成员c的大小为1字节,默认对齐数为4,取较小值1,对齐至1的整数倍,也就是偏移量为6的位置
第四个成员d的大小为4字节,默认对齐数为4,取较小值4,对齐至4的整数倍,也就是偏移量为8的位置
总大小为12字节,为最大对齐数4的整数倍,所以stT2的大小为12字节

stT3
在这里插入图片描述
第一个成员a位于偏移量为0的位置
第二个成员b的大小为4字节,默认对齐数为4,取较小值4,对齐至4的整数倍,也就是偏移量为4的位置
第三个成员c的大小为1字节,默认对齐数为4,取较小值1,对齐至1的整数倍,也就是偏移量为8的位置
第四个成员d的大小为4字节,默认对齐数为4,取较小值4,对齐至4的整数倍,也就是偏移量为12的位置
总大小为16字节,为最大对齐数4的整数倍,所以stT2的大小为16字节

结论
相同大小的结构体成员位于不同位置,结构体的总大小不一样,建议让占⽤空间⼩的成员尽量集中在⼀起

题目四

//VS2022 X64
#define MAX_SIZE A+B
struct _Record_Struct
{unsigned char Env_Alarm_ID : 4;unsigned char Para1 : 2;unsigned char state;unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

当A=2, B=3时,pointer分配( 9 )个字节的空间

解释:
#define是在C和C++中使用的预处理器指令,用于创建宏。编译器在执行代码时,会将define定义的标识符全都替换成相应的值

先计算位段的大小
在这里插入图片描述
冒号后的数字表示bit位,在VS2022中,位段的内存分配是从右到左的,其次遇到不够的时候,直接舍去

Env_Alarm_ID 占4个bit位,Para1 占2个bit位,第一个字节剩1个bit位不够下一个成员,舍去这一个bit位
state 占8个bit位,第二个字节分配给state使用
avail 占1个bit位,第三个字节中的一个bit位给avail 使用
总共占3个字节

sizeof(struct _Record_Struct)计算结果为8

题目给出A = 2 B = 3
sizeof(struct _Record_Struct) * MAX_SIZE 其中的 MAX_SIZE 会被替换为A + B
也就是 3 * 2 +3 ,计算结果为9

malloc为动态内存开辟,如果开辟成功则返回一个指针,开辟失败则返回一个NULL,返回的类型为void*

struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

整句代码的意思为给pointer初始化赋值一个指针,指针指向的内容为开辟好的9字节的内存空间

题目五

在X86下,小端字节序存储

#include<stdio.h>
int main()
{union{short k;char i[2];}*s, a;s = &a;s->i[0] = 0x39;s->i[1] = 0x38;printf("%x\n", a.k);return 0;
}

代码运行结果:>
3839

解释:
在这里插入图片描述
short 和 char i [2] 共用空间,打印的是16进制的a.k,也就是打印两个字节的内容
由于是小端存储,在低地址存放的是低位字节,高地址存放高位字节的内容,也就是倒着存放的,举例:0x11223344在内存中是 44 33 22 11
所以打印的结果为3839

题目六

enum ENUM_A
{X1,Y1,Z1 = 255,A1,B1,
};
enum ENUM_A enumA = Y1;
enum ENUM_A enumB = B1;
printf("%d %d\n", enumA, enumB);

代码运行结果:>
1 257

枚举成员变量默认为从0开始,依次递增1
也就是说
X1 = 0
Y1 = 2
Z1 = 255
A1 = 256
B1 = 257
所以打印结果为1 257

题目八

#include <stdio.h>
int main()
{unsigned char puc[4];struct tagPIM{unsigned char ucPim1;unsigned char ucData0 : 1;unsigned char ucData1 : 2;unsigned char ucData2 : 3;}*pstPimData;pstPimData = (struct tagPIM*)puc;memset(puc, 0, 4);pstPimData->ucPim1 = 2;pstPimData->ucData0 = 3;pstPimData->ucData1 = 4;pstPimData->ucData2 = 5;printf("%02x %02x %02x %02x\n", puc[0], puc[1], puc[2], puc[3]);return 0;
}

代码运行结果:>
02 29 00 00

在这里插入图片描述
位段总共占2个字节的空间,其中ucPim1占了1个字节,ucData0 占了1个bit位,ucData1 占了2个bit位,ucData2 占了3个bit位

2 的二进制为 0010 可以全部存入 ucPim1
3 的二进制为 0011 只能存1bit位到 ucData0
4 的二进制为 0100 只能存2bit位到 ucData1
5 的二进制为 0101 只能存3bit位到 ucData2
将值存入puc数组中,且数组默认元素为0

所以
第一个字节中的内容为 0000 0010 转为16进制为 0x02
第二个字节中的内容为 0010 1001 转为16进制为 0x29
第三个字节没被修改为0
第四个字节没被修改为0

%02x打印16进制,如果小于宽度2则补0
所以打印结果为 02 29 00 00

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

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

相关文章

新手村之SQL——增删改查条件查询

1.查询不同行——DISTINCT SELECT DISTINCT column_name FROM table_nameDISTINCT 关键字需位于列名之前。 2.在指定列中插入数据——INSERT INSERT INTO courses (name, student_count, created_at, teacher_id) VALUES (Flash Sale, 100, 2018-01-01, 5);3.更新数据——UPD…

用Python来解一元二次方程

1 问题 如何利用python 来解一元二次方程组。 2 方法 解一元二次方程是高中数学中的重要内容&#xff0c;也是数学中的基础知识之一。在Python语言中&#xff0c;我们可以使用数学库中的函数来解一元二次方程。一元二次方程的一般形式为&#xff1a;axbxc0&#xff0c;其中a、b…

基于Springboot + vue的汽车资讯网站

qq&#xff08;2829419543&#xff09;获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;springboot 前端&#xff1a;采用vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xf…

基于springboot实现的垃圾分类管理系统

一、系统架构 前端&#xff1a;html | layer | jquery | css 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven 二、 代码及数据库 三、功能介绍 01. 登录页 02. 系统设置-用户管理 03. 系统设置-页面管理 04. 系统设置-角色管…

【Openstack Train安装】一、虚拟机创建

Openstack是一个云平台管理的项目&#xff0c;它不是一个软件。这个项目由几个主要的组件组合起来完成一些具体的工作。Openstack是一个旨在为公共及私有云的建设与管理提供软件的开源项目。它的社区拥有超过130家企业及1350位开发者&#xff0c;这些机构与个人将 Openstack作为…

[Java] 模拟Jdk 以及 CGLib 代理原理

文章目录 JDKarthas 反编译jdk代理对象arthas 反编译的结果是&#xff1a; CGlibmethodProxy 不经过反射调用方法的原理MethodProxy原理模拟 结合目标对象使用模拟结合 代理对象使用 JDK Jdk代理的最简单模拟&#xff0c; 由前文可知 JDK动态代理需要实现接口&#xff0c;所以…

★543. 二叉树的直径

543. 二叉树的直径 简单题&#xff0c;确实不难。 相当于就是求节点的深度。左孩子的最大深度 右孩子的最大深度 1 根节点深度。 本题要求的就是路径数&#xff0c;这里的路径数 节点数 - 1&#xff0c;然后想一下&#xff0c;对于一个节点来说&#xff0c;以他为根左右两…

数据结构与算法设计分析——NP完全理论

目录 一、P类问题与NP类问题的定义二、常见的NP类问题&#xff08;一&#xff09;旅行商问题&#xff08;TSP&#xff09;&#xff08;二&#xff09;哈密尔顿回路问题&#xff08;三&#xff09;判断回路问题&#xff08;四&#xff09;图的着色问题&#xff08;五&#xff09…

使用AOS实现网页动画效果

在现代Web开发中&#xff0c;动画效果是提升用户体验和页面交互性的重要因素之一。而AOS&#xff08;Animate On Scroll&#xff09;作为一个强大的动画库&#xff0c;可以帮助我们轻松地实现网页元素的滚动动画效果。 什么是AOS&#xff1f; AOS是一个基于CSS3和JavaScript的…

Transformer

目录 Encoder Add&Norm:&#xff08;LayerNorm&#xff09;Transformer中的归一化(五)&#xff1a;Layer Norm的原理和实现 & 为什么Transformer要用LayerNorm - 知乎 (zhihu.com) LayerNorm怎么做的&#xff1f; Feed Forward: FeedForward代码&#xff1a; 公式…

Java Stream流对多个字段动态指定字段排序

Java 8 的 Stream 使用了函数式编程模式,它可以被用来对集合或数组进行链状流式的排序就需要搬出Stream sort方法进行排序,重写其中的Comparator。 本文重点介绍使用Java Stream流排序器Comparator对List集合进行排序的技巧,包括复杂实体对象多字段升降序排序方法。 1为什么…

学习TypeScrip5(函数扩展)

函数的类型 注意&#xff0c;参数不能多传&#xff0c;也不能少传 必须按照约定的类型来 const fn (name: string, age:number): string > {return name age } fn(张三,18) 函数的可选参数? 通过?表示该参数为可选参数 const fn (name: string, age?:number): stri…

Android 12 及以上授权精确位置和模糊位置

请求位置信息权限 为了保护用户隐私&#xff0c;使用位置信息服务的应用必须请求位置权限。 请求位置权限时&#xff0c;请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于&#xff0c;系统中包含与位置相关的多项权限。具体请求哪项权限以及…

栈和队列的OJ题——14.用栈实现队列

14.用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 此题可以用两个栈实现&#xff0c;一个栈进行入队操作&#xff0c;另一个栈进行出队操作 出队操作&#xff1a; 当出队的栈不为空是&#xff0c;直接进行出栈操作&#xff…

算法通关村第七关—迭代实现二叉树的遍历(黄金)

迭代实现二叉树的遍历 迭代法实现前序遍历 前序遍历是中左右&#xff0c;如果还有左子树就一直向下找。完了之后再返回从最底层逐步向上向右找。不难写出如下代码&#xff1a;&#xff08;注意代码中&#xff0c;空节点不入栈&#xff09; public List<Integer>preorde…

VSCode 中将头文件和头文件函数分离,编译主函数跳出 undefined reference to 的问题解决

VSCode 编写 C &#xff08;.h&#xff0c;.cpp 文件分离&#xff09;代码&#xff0c;编写完成后&#xff0c;编译遇到了编译错误 undefined reference to xxx。 开始还以为使用了 -stdc20 而不能使用 #include “xxx.h" 方式头文件&#xff0c;但仔细一想虽然引入了 im…

前端这个岗位对于整个项目的意义

在软件开发这个领域&#xff0c;开发一款软件就意味着一个项目的诞生&#xff0c;那么&#xff0c;一个项目诞生它包括很多人的共同协作和努力去实现&#xff0c;那么大概包括以下这些步骤&#xff1a; 1.需求分析&#xff1a;这是软件开发的第一步&#xff0c;商务人员和产品…

基于YOLOv7算法的的高精度实时通用目标检测识别系统(PyTorch+Pyside6+YOLOv7)

摘要&#xff1a;基于YOLOv7算法的高精度实时检测识别系统可用于日常生活中检测与定位多种目标&#xff0c;此系统可完成对输入图片、视频、文件夹以及摄像头方式的目标检测与识别&#xff0c;同时本系统还支持检测结果可视化与导出。本系统采用YOLOv7目标检测算法来训练数据集…

OpenHarmony 应用(HarmonyOS 原生应用)- 写一个 Hello World 并在华为手机上跑起来

OpenHarmony 简介 ArkUI 开发框架 OpenHarmony 提供了一套UI开发框架&#xff0c;即方舟开发框架&#xff08;ArkUI 框架&#xff09;。 两种开发范式 支持两种开发范式&#xff0c;分别是基于ArkTS的声明式开发范式&#xff08;简称“声明式开发范式”&#xff09;和兼容J…

【Leetcode题单】(01 数组篇)刷题关键点总结03【数组的改变、移动】

【Leetcode题单】&#xff08;01 数组篇&#xff09;刷题关键点总结03【数组的改变、移动】&#xff08;3题&#xff09; 数组的改变、移动453. 最小操作次数使数组元素相等 Medium665. 非递减数列 Medium283. 移动零 Easy 大家好&#xff0c;这里是新开的LeetCode刷题系列&…