2022
04-12
04-12
一篇文章带你了解C语言内存对齐公式
目录一、前言二、公式2.1、例子一2.2、例子二2.3、例子三总结一、前言每一个特定平台上的编译器都有自己的默认“对齐系数”(也叫对齐模数)。GCC中默认#programpack(4),即4个字节的内存对齐。Keil也是采用4字节对齐的。也可以通过预编译命令#pragmapack(n),n=1,2,4,8,16来改变这一系数,一般情况下尽量使用自然对齐系数,不要修改它。STM32单片机上各个变量占用的字节数:二、公式公式一、结构体变量里,成员的起始地址必须...
继续阅读 >
目录一、内存对齐为4个字节的好处二、内存对齐的目的是以空间换取速度2.1、内存对齐为4的例子2.2、内存没有使用内存对齐的例子CPU读取数据的过程:三、掌握内存对齐的必要性总结一、内存对齐为4个字节的好处首先,了解一下CPU从内存里读取数据的流程:第一步,CPU通过地址总线,找到该数据的位置。第二步,通过控制总线,发送读取数据的指令。第三步,通过数据总线,从内存里获取该数据的内容。内存对齐使用4个字节的原因有:1.STM...
目录内存对齐三、在内存对齐话题下的sizeof与offsetof宏3.1、sizeof3.2、offsetof宏3.3、Debug总结内存对齐先看如下代码:结构体Test1占用了多少字节?如果事先不知道内存对齐的话,答案肯定是:1个字节(char)+4个字节(int)+1个字节(char)=6个字节。事实上,Test1结构体占用了12个字节,从DEBUG模式下Watch1观察:OK,不就猜少了6个字节吗?有什么影响吗?先不说影响吧,咱们先来看看单片机内存里的实际情况。从上图看到...
目录一、问题一(打印阶乘)问题描述:问题分析:解决方案:1.让我们检查一下结果,发现问题很有可能是循环的时候没有循环本身2.这里要引入C++中STL库的一个知识点二、问题二(比较多项式计算时间)问题描述:问题分析:解决方案:总结一、问题一(打印阶乘)问题描述:打印出数字一到数字20的阶乘一开始,我总会多打印出一个1,这令我十分苦恼,并且从n等于13开始,数据就开始溢出问题分析:让我们分析一下问题,这里面存在着两个...
目录前言数据类型介绍类型的基本归类整形在内存中的存储原码、反码、补码大小端介绍浮点型在内存中的存储前言前面我们学习了C语言的一些基本知识和基础的语法,想必大家对C语言都有了自己的认识。当然只是学习这些知识还是不够的,我们需要进行更加深入的学习。从本章开始,我们将进行C语言进阶阶段的学习,所以难度会有所增加。数据类型介绍前面我们已经学习了基本的内置类型:char//字符数...
目录什么是顺序表?1.定义顺序表结构体:2.初始化顺序表:3.销毁顺序表:4.打印顺序表:5.判断容量+扩容:6.头插数据:7.尾插数据:8.指定下标位置插入数据:9.删除数据:10.尾删数据:11.指定下标位置删除数据:12.查找数据:13.修改数据:14.源代码:1.SeqList.h:2.SeqList.cpp:3.test.cpp:15.测试:总结什么是顺序表?顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址...
目录你认为这段代码输出什么?为什么不等于呢?应该怎么解决?那么怎么判断两个浮点数f1和f2相等呢。伪代码可以简化为>>怎么判断浮点数等于0?还有一个问题总结你认为这段代码输出什么?intmain(){floatf1=1.1;floatf2=2.2;if(f2-1.1==f1)printf("等于");elseprintf("不等于");return0;}答案是不等于。为什么不等于呢?因为在C语言中浮点数是存在精度损失的,有可能比原来的数大,也有可能小。在下图...
目录什么是指针指针的应用指针±整数指针+指针指针-指针野指针野指针成因指针和数组指针±和数组的关系二级指针总结什么是指针指针是应该对象,可以直接指向电脑存储器中的某个地方,这个地方就是内存单元,指针指向的是一个对象的地址。地址的指向就是内存单元,一个内存单元是一个字节,在32位平台上面,一个指针是4个字节。因为32位的平台有32根地址线,每根地址线是1bit,所以32位平台的指针大小是4个字节。同理,...
目录思路:当n=1时:当n=2时:当n=3时:当n=4时:见代码运行截图总结汉诺塔的游戏规则:有三根金刚石柱子A、B、C,在A柱子上从下往上按照大小依次减小的顺序摞着64片黄金环。大梵天命令婆罗门把环从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在任何一个柱子上,小环上不能放大环,在三根柱子之间一次只能移动一个环。即将A柱子上全部的环通过中间柱子B(B柱子作为中介)移动到C柱子上当A只有一个环的时候:A->C当A只有...
目录gcc命令文件头将内核载入内存总结gcc命令使用gcc编译c语言-c编译、汇编到目标代码,不进行链接,也就是直接生成目标文件-o将输出的文件以指定文件名来储存,有同名文件存在时直接覆盖gcc-c-okernel/main.okernel/main.c编译:编译号之后只是个目标文件,也称为待重定位文件,重定位指的是文件里面所用的符号还没有安排地址,这些符号的地址需要将来与其他目标文件“组成”一个可执行文件时再重新定位(编排...
目录1.冒泡排序2.选择排序3.插入排序4.归并排序5.快速排序总结1.冒泡排序它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。算法步骤比较相邻的元素。如果第一个比第二个大,就交换他们两个。对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所...
目录背景引入问题分析指针大小参数位置排布解决问题额外的测试总结参考资料背景引入近期在看一本书,叫做《嵌入式C语言自我修养》,写的内容对我帮助很大,是一本好书。在第6章,GNUC编译器扩展语法精讲一节,这本书给出了一些变参函数的例子://1.变参函数初体验#include<stdio.h>voidprint_num(intcount,...){int*args;args=&count+1;for(inti=0;i<count;i++){printf("*args:%d\n",*args);args++;}}intma...
pthread_create()函数详解pthread_create是类Unix操作系统(Unix、Linux、MacOSX等)的创建线程的函数。它的功能是创建线程(实际上就是确定调用该线程函数的入口点),在线程创建以后,就开始运行相关的线程函数。头文件:#include<pthread.h>函数原型:intpthread_create(pthread_t*tidp,constpthread_attr_t*attr,void*(*start_rtn)(void*),void*arg);各个参数说明:第一个参数为指向线程标识符的指...
目录1.设计简单菜单2.创建棋盘3.下棋过程的实现 3.1玩家下棋 3.2电脑下棋3.3判断输赢4.游戏源码总结1.设计简单菜单相信大家在玩游戏时会发现,进入游戏前会有菜单拱你选择,你可以选择你想要的模式,三子棋也是同样的。voidmenu(){printf("******************************\n");printf("*********0.play*********\n");printf("*********1.exit*********\n");printf("******************************\n")...
本文实例为大家分享了C语言系列之推箱子游戏的具体代码,供大家参考,具体内容如下输入WSAD控制行走,只需要把一个方向的代码写好了,剩下的是三个方向就是复制粘贴和简单的修改就可以了。#include<stdio.h>#include<conio.h>//键盘输入函数库//0:空地1:墙2:箱子要放的位置5:人与星号重叠5:箱子与星号重叠3:人+-34:箱子:+-4intmap[10][10]={1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,2,0,0,1,...
本文实例为大家分享了C语言实现推箱子功能的具体代码,供大家参考,具体内容如下前言:先说说我写推箱子小游戏的过程。第一版:没有图形化界面,不能选关。只有推箱子的最基础功能。第二版:增加图形化界面,但是不能选择关卡。最终版:增加选择关卡功能、播放/关闭音乐功能、退出游戏功能,捕获鼠标功能。首先看一下最终版效果图功能点分析:打开/关闭音乐和退出游戏比较简单。打开音乐所需调用的头文件#include<graphics.h>//...