C语言复习笔记 15

全国计算机二级C语言考试前期复习1(2022年9月份)笔记 计算机二级C语言复习笔记 阅读详情

结构体内存分配对齐深入理解

问题描述:
定义好一个结构体之后,结构体所占的内存大小是多少?

struct stu {
    int a;
    double b;
    char c[9];
};

按照结构体内存大小的计算方式,结构体的内存大小,就是各成员所占大小的总和。但其实不仅仅是这样的,因为结构体分配内存时候,编译器有一个内存分配对齐的机制。——目的是为了使每个字节步长都一致,系统执行起来速度会加快,从而提高了程序的运行效率。

那具体是如何对齐呢?
首先要知道出于效率的考虑,C语言引入了字节对齐机制,一般来说,不同的编译器字节对齐机制有所不同,但还是有以下3条通用准则:
(1)结构体变量的大小能够被其最宽基本类型成员的大小所整除;
(2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;
(3)结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

看完这个我来再看上面那段代码
struct a 
{ 
 int b;/*本身占用4个字节,但是因为下面最宽数据类型是double,要让它整除,所以占用8个字节,编译器自动对齐(参考第一点)*/ 
 double c;/*这个就是最宽数据类型,占用字节就是它本身8个字节*/ 
 char d[9];/*本身每个char占用1个字节,定义了9个char所以大家认为一共用9个字节,但是其实是16个字节,因为要被double整除(参照第二点)*/ 
}; 
void main() 
{ 
 prinf("%d",sizeof(struct a));//所以最后输出为32 
}

动态分配内存和回收

内存四区模型

流程说明
1、操作系统把物理硬盘中的代码加载(load)到内存中
2、操作系统把C代码分成4个区
3、操作系统找到main()函数入口

这里写图片描述

一个右C/C++编译的程序占用的内存分四个部分:
1、栈区(stack):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方
式类似于数据结构中的栈。
2、堆区(heap: 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回 收 。
注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、数据据区:主要包括静态全局区和常量区,如果要站在汇编角度细分的话还可以分为很多小的区。
(1)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变
量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
程序结束后有系统释放
(2)常量区 :常量字符串就是放在这里的。 程序结束后由系统释放
5、代码区:存放函数体的二进制代码。

动态内存分配

malloc分配的内存是在堆区
程序员自己分配,自己释放,如果没有释放由操作系统释放
操作系统对分配的内存进行权限管理,已经分配的内存但没有被释放,不能再进行分配使用,这块内存也就被浪费掉了,造成了内存泄露

重启系统后,内存中的数据全部清零,全部重新规划,就不存在这个内存不足的问题了。但是如果还运行这些不完善的程序,还会内存泄露。堆的作用主要就是为程序提供动态内存分配,这样就能满足程序运行时增加内存的要求。

回调函数

简单来说,如果把一个函数的入口地址传递给一个函数指针,通过函数指针去调用这个函数,那么称这个函数为回调函数。回调函数的一般用法为:A进行结构体的定义(成员中包括回调函数的指针),B进行声明结构体变量,并向A注册回调函数。A在某个特定事件触发的时候,遍历并执行所有注册的回调函数。
下面代码是一个简单回调函数的例程

#include <stdio.h>

struct operation {
    void (*callback)();
};

void trigger(struct operation* ops, int ops_length) {
    int i = 0;
    while(i++ < ops_length) {
        ops->callback();
        ops++;
    }
}

void a_callback() {
    printf("I'm A\n");
}

void b_callback() {
    printf("I'm B\n");
}

int main(int argc, char* argv[]) {
    struct operation A,B;
    A.callback = &a_callback;
    B.callback = &b_callback;
    struct operation ops[2];
    ops[0] = A;
    ops[1] = B;
    trigger(ops, 2);
    return 1;
}

A、B分别向operation注册了各自的回调函数。

main()函数的参数问题

main函数的参数

  前面介绍的main函数都是不带参数的。因此main 后的括号都是空括号。实际上,main函数可以带参数,这个参数可以认为是 main函数的形式参数。C语言规定main函数的参数只能有两个, 习惯上这两个参数写为argc和argv。因此,main函数的函数头可写为: main (argc,argv)C语言还规定argc(第一个形参)必须是整型变量,argv( 第二个形参)必须是指向字符串的指针数组。加上形参说明后,main函数的函数头应写为:

main (argc,argv)
int argv;
char *argv[];或写成:
main (int argc,char *argv[])

  由于main函数不能被其它函数调用, 因此不可能在程序内部取得实际值。那么,在何处把实参值赋予main函数的形参呢? 实际上,main函数的参数值是从操作系统命令行上获得的。当我们要运行一个可执行文件时,在DOS提示符下键入文件名,再输入实际参数即可把这些实参传送到main的形参中去。

  DOS提示符下命令行的一般形式为: C:>可执行文件名 参数 参数……; 但是应该特别注意的是,main 的两个形参和命令行中的参数在
位置上不是一一对应的。因为,main的形参只有二个,而命令行中的参数个数原则上未加限制。argc参数表示了命令行中参数的个数(注意:文件名本身也算一个参数),argc的值是在输入命令行时由系统按实际参数的个数自动赋予的。例如有命令行为: C:>E6 24 BASIC dbase FORTRAN由于文件名E6 24本身也算一个参数,所以共有4个参数,因此argc取得的值为4。argv参数是字符串指针数组,其各元素值为命令行中各字符串(参数均按字符串处理)的首地址。 指针数组的长度即为参数个数。数组元素初值由系统自动赋予。其表示如图6.8所示:

main(int argc,char *argv){
while(argc-->1)
printf("%s\n",*++argv);
}

本例
是显示命令行中输入的参数如果上例的可执行文件名为e24.exe,存放在A驱动器的盘内。
因此输入的命令行为: C:>a:e24 BASIC dBASE FORTRAN
则运行结果为:
BASIC
dBASE
FORTRAN
  该行共有4个参数,执行main时,argc的初值即为4。argv的4个元素分为4个字符串的首地址。执行while语句,每循环一次 argv值减1,当argv等于1时停止循环,共循环三次, 因此共可输出三个参数。在printf函数中,由于打印项*++argv是先加1再打印, 故第一次打印的是argv[1]所指的字符串BASIC。第二、 三次循环分别打印后二个字符串。而参数e24是文件名,不必输出。

  下例的命令行中有两个参数,第二个参数20即为输入的n值。在程序中*++argv的值为字符串“20”,然后用函数”atoi”把它换为整型作为while语句中的循环控制变量,输出20个偶数。

#include"stdlib.h"
main(int argc,char*argv[]){
int a=0,n;
n=atoi(*++argv);
while(n--) printf("%d ",a++*2);
}

  本程序是从0开始输出n个偶数。指向指针的指针变量如果一个指针变量存放的又是另一个指针变量的地址, 则称这个指针变量为指向指针的指针变量。

【C语言基础学习笔记】一、初始C语言(3) 说明:我是一个初学c语言的小白,很多地方都不是很理解,所以就会自己动手敲代码进行相应的推理验证,希望可爱的你在看到这些步骤时,不要嫌弃我啰嗦。(比如吐槽:这作者咋这样呀,这么简单的还要敲代码验证,真菜呀!…我:好吧,我不装了,我摊牌了,我确实菜,真的菜,咋滴啦,还不允许初学者菜呀!) EOF-- - end of file 文件结束标志 值: - 1 提示:本小结是初始C语言最后一小部分内容,之后会有一个初始C语言总结的文章,包含初始C语言(1)(2)(3)复习专用的思维导图,一些用于编程练习的ca 阅读详情

相关推荐

C语言学习笔记基础完整

C语言基础部分学习笔记全部

【C语言】 知识点汇总--基础知识点梳理(超全超详细)

目录一、从源代码到exe二、基本数据类型三、字符在屏幕上的显示原理四、溢出现象五、类型转换规律六、短路问题七、指针变量类型的作用 八、指针类型的扩展——多级指针九、指针类型的扩展——指针数组十、指针类型的扩展——数组指针十一、一维数组-名-特性十二、二维数组-名-特性十三、大端存储-小端存储十四、函数在源代码中的三种状态十五、堆区与栈区的区别十六、函数的执行原理十七、枚举类型十八、typedef二十、const二十一、全局/局部变量生命周期与作用域二十二、static静态变量二十三、extern二十四、宏d

jia_03的博客 2万+

C语言复习笔记

C语言复习笔记,比较全面,有助于C语言的学习。

图及其应用c语言实现(数据结构复习最全笔记)(期末复习最新版)

图 一.图的基本概念 1.图的定义 图是由顶点(vertex)集合及顶点间的关系组成的一种数据结构。Graph=(V,E)Graph=(V,E)其中,顶点集合 V={x|x∈某个对象数据集}V={x|x∈某个对象数据集} 是有穷非空集合;E={(x,y)|x,y∈V}E={(x,y)|x,y∈V} 是顶点间关系的有穷集合,也叫边(edge)集合。Path(x,y)Path(x,y)表示从顶...

markconca的博客 1万+

C语言学习笔记

C语言学习笔记,C语言学习笔记,qsort排序。。。。。。。。。。。。。。。。。。。。。。。。。。。。

【iceberg数据一致性】iceberg如何保证高并发数据一致性

那么在高并发的时候,同时操作某张表时是如何运作的呢?其实这里iceberg引用了乐观锁的方法。其实在写入数据的时候是有一个验证的操作的,即在准备写入时会检查原文件和带写入文件的差异,如果存在本次写入数据以外的数据,则代表有其他操作已经更新了原文件,那么本次写入会取消,并重试写入的步骤,知道验证完成,写入完成,如此就保证了数据的一致性,并且也解决了HMS锁的问题。在使用iceberg写数据时,一直弄不清楚为什么iceberg写入快,并且能够保证数据的一致性。今天决定搞清楚这个问题,经过查询和理解,写下来。

你的博客 1043

C语言基础笔记(全)

printf函数可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等,实际原理是printf函数将这些类型的数据格式化为字符串后,放入标准缓冲区,然后将结果显示到屏幕上printf函数根据format给出的格式打印输出到stdout(标准输出)和其他参数中代码格式%c字符%d带符号整数%f浮点数%s一串字符%u无符号整数%x无符号十六进制数,用小写字母%X无符号十六进制数,用大写字母%p一个指针%%一个'%'符号。

señoritaw的博客 1万+

别再只跑recon-all了!FreeSurfer实战:从T1图像到freeview可视化的完整避坑指南

本文详细解析FreeSurfer从T1图像处理到freeview可视化的全流程,包括环境配置、recon-all深度解析、高级可视化技巧及性能优化策略。特别针对常见错误提供解决方案,帮助用户高效完成MRI数据分析,避免常见陷阱。

weixin_33404102的博客 353

2020.04.15c语言复习重点【读书笔记】

第一章 绪论 1.1 c语言的设计基础 对于c语言设计分为5个步骤 **程序设计=问题分析+结构特性的设计+算法的设计+流程的描述+调试与运行** 问题分析:当拿到一道算法题或者需要解决的问题时,需要先分析我需要做什么,如何从A得到B,其中有几条路,最后确定一条最短路径。 其中需要确定是否为数值型问题,非数值型问题,需要的精度等等 输入输出的设备:键盘、打印机、显示器等等 使用的数学模型求解可...

Edward_tjr的博客 294

BEV感知技术全景解析:从纯视觉到多传感器融合的实战指南

本文全面解析了自动驾驶中的BEV感知技术,从纯视觉到多传感器融合的实战应用。文章深入探讨了BEV如何提供“上帝视角”,对比了IPM、Lift-Splat-Shoot及Transformer等核心实现范式,并详细阐述了多传感器融合(尤其是中融合)的工程实践与优势,为开发者提供了从理论到原型搭建的完整指南。

win55的博客 1139

keil自动分配SDRAM空间设置使用

1.修改.sct文件。

qizhi321123的博客 1404

笔记:Linux环境C语言复习(15)// 线程

线程1. 线程与进程关系2. 线程创建、退出、分离、回合2.1 线程创建 - pthread_create(3)2.1.1 获取线程id(thread id) - pthread_self(3)2.1.2 举例创建线程举例2.2 线程退出 - pthread_exit(3)2.2.1 exit(3)、pthread_exit(3)、return()区别2.2.2 pthread_exit(3)2....

weixin_42754578的博客 412

把复杂计算推到数据库里:ABAP CDS View Table Function 从原理到落地实践

摘要:本文深入解析ABAP CDS Table Function技术,重点探讨其在复杂业务场景下的应用价值。当CDS View无法满足窗口函数、递归计算等高级需求时,Table Function通过结合CDS类型系统与AMDP的数据库原生计算能力,成为关键解决方案。文章详细介绍了Table Function的架构设计(CDS实体声明+AMDP实现)、客户端处理机制、开发传输流程中的注意事项,并通过航班数据示例展示最小实现闭环。这项技术特别适用于需要将复杂计算下推到数据库层的场景,能显著提升RAP和OData

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2292

C语言学习及复习笔记-【15】C预处理器

ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。宏描述DATE当前日期,一个以 “MMM DD YYYY” 格式表示的字符常量。TIME当前时间,一个以 “HH:MM:SS” 格式表示的字符常量。FILE这会包含当前文件名,一个字符串常量。LINE这会包含当前行号,一个十进制常量。STDC当编译器以 ANSI 标准编译时,则定义为 1。当上面的代码(在文件test.c。

文斗士的专栏 318

2025年软件测试职业院校技能大赛—ERP管理平台-基础信息管理商品管理测试用例

竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 323

uniapp - 详细解决 H5 网页报错 Uncaught Error: Async component timed out after ? ms.(移动端h5页面白屏或加载缓慢失败,超时报错处理)

uni-app,vue3,网页,h5,移动端,手机H5页面,浏览器,报错,uniapp报错,Asynccomponenttimedoutafter,如何解决这个问题,vue3Asynccomponenttimedoutafter,异步组件超时了怎么办,async,详细解决方案,AsyncComponents异步组件,导致页面打不开了,白屏什么也不显示,网页载入非常慢卡顿,vue3网站报错,超时,nuxt3,详细解决方案,浏览器控制台报错,爆红并且页面卡住了,依旧报错,找不到异步组件的报错

🏆 前端领域优质创作者 3776

C语言学习笔记 - 61.流程控制15 - 复习算法思维与程序掌握方法

本文重点阐述了C语言程序设计中算法优先的核心思想。文章通过变量交换和三个数排序两个典型案例,详细说明了程序设计的基本流程:先明确算法思路(输入、处理步骤、输出),再用语法实现。强调看懂程序需分三步:理解执行流程、分析语句功能、代入数据验证。指出掌握程序需通过修改调试、独立复现等实践环节,并提供了具体的学习步骤建议。最后总结了程序设计的关键在于算法思维培养,而不仅是语法记忆,同时给出了调试练习和间隔复习的方法论。

weixin_57913829的博客 192

PyTorch深度学习实战(39)——少样本学习(Few-shot Learning)

小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分类和推理的问题。在小样本学习中,我们希望通过利用已有的少量样本和先验知识来进行泛化,以便在面对新的、未见过的类别时能够做出准确的预测。这就要求模型能够从有限的训练样本中提取出有用的信息,并能够将这些信息应用到新类别的样本中去。在本节中,将介绍孪生、原型和关系网络的原理,并使用 PyTorch 实现孪生网络。

盼小辉丶的博客 1万+

C+

C语言学习计划:计划半年2小时看书1小时做习题0.5小时做笔记0.5小时复习笔记每天如是每天上这记录每天进度开始2006.8.24 -2007.2.15

梦飞旋影的专栏 721

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

1.如何学好C语言(班会)

1.第一遍只看并理解,中途标记笔记,第二遍的时候再拖进度条整理笔记。2.最牛逼的学习方法是模仿。

2302_79215155的博客 182

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C语言复习笔记(一)C语言概论初识

从今天开始没有复习c语言的要抓紧时间了哦,如果不会复习的话,不妨跟着我一起来复习吧,现在小编已经结课了,反正闲着也是闲着,所以小编想用五天时间对c语言做一个系统性复习。欢迎大家一起来学习,互相指正,互相进步哦!加油,干就完了,奥利给!!! 不bb了,直入正题 第1章 C语言概论初识 (温馨提示,如果你看起来毫不费力,你就已经是大佬了哦,如果有些吃力,那就赶紧抓紧时间再学一遍吧,这个复习不针对小白哦) 最简单的C语言程序 【例1.1】要求在屏幕上输出:机械电子工程 解题思路: 在主函数中用printf函数原样

royal_77QAQ的博客 1588

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C语言复习笔记: PTA题集整理

C语言复习笔记: PTA题集整理 文章目录C语言复习笔记: PTA题集整理@[toc]C语言取模运算及辗转相除法易错内容:将/运算符当作%使用解答代码:算法实现1:算法实现2求出大于m的最小素数:PTA题集输入格式:输出格式:输入样例:输出样例:代码解答:课堂代码:存在问题 14 输出15改进后的代码:相似内容:遍历元素 并 输出或者返回数值 找素数7-3 求幂级数展开的部分和 (20分)输入格式:输出格式:输入样例:输出样例:需要注意的地方:代码内容解答代码1:修改后的代码:最佳情侣

weixin_44640697的博客 4950

C语言复习

C语言复习笔记1 一、数据类型、运算符与表达式 1.常量与变量 (1)常量分为:整型常量、实型常量、字符常量、字符串常量和符号常量。如:15是整型常量,3.14159是实型常量,‘a’是字符常量,"abc123"是字符串常量. (2)变量是指在程序运行过程中其值可以改变的量. 2.整型常量 (1)三种形式: 十进制:以非0开始的数,数码取值范围是0~9,可以是正数、负数,如25、-36、+23等。 八进制:以0开始的数,数码取值为0~7,如037、0123等。 十六进制:以0x或0X开始的数,数码取值为0~

yrr999的博客 3082

大一C语言复习题库

一、单项选择题(每小题2分,共50分) 1、一个C程序的执行是从__A___。 A、本程序的main函数开始,到main函数结束 B、本程序的main函数开始,到本程序文件的最后一个函数结束 C、本程序文件的第一个函数开始,到本程序文件的最后一个函数结束 D、本程序文件的第一个函数开始,到本程序main函数结束 2、C语言程序的基本单位是___C___。 A、程序行 ...

假技术Po主 2万+
上一篇: C语言复习笔记 14
下一篇: C语言链表学习笔记
henhaoji_123
博客等级 码龄10年 260粉丝 283原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值