Day4-C语言高级编程

1. gcc和gdb的用法

GNU工具:编译工具:把一个源程序编译为一个可执行程序调试工具:能对执行程序 进行源码或汇编调试软件工程工具:用于协助多人开发或大型软件项目的管理,如make、CVS、Subvision其他工具:用于把多个目标文件链接成可执行文件的链接器,或用做格式转换的工具。GCC:全称为GNU CC,GNU项目中符合ANSI C标准的编译系统编译如C,C++,Object C,Java,Fortran,Pascal,Modula-3,Ada等多种语言GCC是可以在多种硬件平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%一个交叉平台编译器,适合在嵌入式领域的开发编译gcc所支持后缀名解释:- .c           C原始程序- .C/.cc/.cxx  C++原始程序- .m           Objective-C原始程序- .i           已经过预处理的C原始程序- .ii          已经过预处理的C++原始程序- .s/.S        汇编语言原始程序- .h           预处理文件(头文件)- .o           目标文件- .a/.so       编译后的库文件编译器的主要组件分析器:分析器将源语言程序代码转换为汇编语言。因为要从一种格式转换为另一种格式(C到汇编),所以分析器需要知道目标机器的汇编语言汇编器:汇编器将汇编语言转换为CPU可以执行字节码链接器:链接器将汇编器生成的单独的目标文件组合成可执行的应用程序。链接器需要知道这种目标格式以便工作标准C库:核心的C函数都有一个主要的C库来提供。如果在应用程序中用到了C库中的函数,这个库就会通过链接器和源代码连接来生成最终的可执行程序GCC最基本的用法:gcc [选项] [文件名]-c,只编译,不连接成为可执行文件,编译器只是由输入的.c等源代码文件生成.o为后缀的目标文件,通常用于编译不包含主程序的子程序文件-o output_filename,确定输出文件的名称为output_filename,同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出预设的可执行文件a.out。-g,产生符号调试工具(GNU的gdb)所必要的符号资讯,想要对源代码进行调试,我们就必须加入这个选项。-O,对程序进行优化编译、连接,采用这个选项,整个源代码会在编译、连接过程中进行优化处理,这样产生的可执行文件的执行效率可以提高,但是,编译、连接的速度就相应地要慢一些-O2,比-O更好地优化编译、连接,当然整个编译、连接过程会更慢-I dirname,将dirname所指出地目录加入到程序头文件目录列表中,是在预编译过程中使用地参数。-L dirname,将dirname所指出地目录加入到程序函数档案库文件的目录列表中,是在链接过程中使用的参数GCC的编译流程分为四个步骤:预处理编译汇编链接
GCC处理过程
C语言编译流程
调试器-GDB调试流程首先使用gcc对文件进行编译,一定要加上选项‘-g’#gcc -g demo1.c -o demo#gdb demo调试流程查看文件 - (gdb) l设置断点 - (gdb) b 6删除断点 - (gdb) del num查看断点情况 - (gdb) info b运行代码 - (gdb) r查看变量值 - (gdb) p n单步运行 - (gdb) n- (gdb) s恢复程序运行 - (gdb) cmain函数设置参数 - (gdb) set args [参数]...帮助 - (gdb) help [command]

2. 条件编译和结构体

条件编译:编译器根据条件的真假决定是否编译相关的代码,常见的条件编译有两种方法:根据宏是否定义:#ifdef <macro>....#else....#endif根据宏的值:#if <macro>....#else....#endif​
结构体:在实际的处理对象中,有许多信息是由多个不同类型的数据组合在一起进行描述,而且这些不同类型的数据是互相联系组成了一个有机的整体。这就要用到一种新的构造类型数据——结构体,简称结构。结构体的使用为处理复杂的数据结构(如动态数据结构等)提供了有效的手段,而且为函数间传递不同类型的数据提供了方便。结构体是用户自定义的新数据类型,在结构体中可以包含若干个不同数据类型和不同意义的数据项。结构体的定义:struct 结构体名{数据类型 成员名1;数据类型 成员名2;...数据类型 成员名n;};结构体变量的定义:先定义域结构体,再定义变量名struct 结构体名{成员列表;};struct 结构体名 变量名在定义类型的同时定义变量:struct 结构体名{成员列表;}变量名;直接定义结构体变量struct      //没有结构体名{成员列表;}变量名;结构体的使用:结构体变量名.成员名结构体初始化:struct 结构体名 变量名={初始数据表};
/*案例:demo2*/
#include <stdio.h>
#include <string.h>
​
#define N 20
​
struct student{int no;char name[N];float score;
}s3 = {3, "s3", 90}, s4 = {4, "s4", 88};
​
​
int main(int argc,char *argv[])
{struct student s1, s2;s1.no = 1;strcpy(s1.name,"s1");s1.score = 90;
​
​printf("%d %s %.2f\n",s1.no,s1.name,s1.score);s2 = s1;
​s2.no = 2;printf("%d %s %.2f\n",s2.no,s2.name,s2.score);printf("%d %s %.2f\n",s3.no,s3.name,s3.score);printf("%d %s %.2f\n",s4.no,s4.name,s4.score);return 0;
}
​
/*运行结果:
linux@ubuntu:~/Linux_c/day04$ gcc demo2.c -Wall -lm
linux@ubuntu:~/Linux_c/day04$ ./a.out
//上两行为命令行内编译和执行代码
1 s1 90.00
2 s1 90.00
3 s3 90.00
4 s4 88.00
*/

3. 结构体数组和结构体指针

结构体数组的定义:具有相同结构体类型的结构体变量组成的数组,叫结构体数组,它的定义同平台数组一样。
结构体数组的初始化:struct 结构体名 数组名[元素个数]={初始化数据表};结构体指针:一个指针变量用来指一个结构体变量。此时该指针变量的值是结构变量的起始地址,该指针被称为结构体指针。一般定义形式:struct 结构体名 *结构指针名;
/*案例:demo3*/
#include <stdio.h>
​
#define N 20
​
struct student {int no;char name[N];float score;
}s2[5];
​
int main(int argc,char *argv[])
{struct student s1[] = {{1,"s1",90},{2,"s2",89},{3,"s3",78}};int i;​for(i = 0;i<3;i++){printf("%d %s %.2f\n",s1[i].no,s1[i].name,s1[i].score);s2[i] = s1[2-i];}
​puts("\n-------s2--------");for(i = 0;i<3;i++)printf("%d %s %.2f\n",s2[i].no,s2[i].name,s2[i].score);return 0;
}
​
/*运行结果:
linux@ubuntu:~/Linux_c/day04$ gcc demo3.c -Wall
linux@ubuntu:~/Linux_c/day04$ ./a.out 
1 s1 90.00
2 s2 89.00
3 s3 78.00
​
-------s2--------
3 s3 78.00
2 s2 89.00
1 s1 90.00
*/
/*案例:demo4*/
#include <stdio.h>
​
#define N 20
​
struct student {int no;char name[N];float score;
};
​
int main(int argc,char *argv[])
{struct student s1[] = {{1,"s1",90},{2,"s2",89},{3,"s3",78}};int i;struct student *p;
​p = s1;
​for(i = 0;i<3;i++){printf("%d %s %.2f\n",p->no,p->name,p->score);p++;}
​return 0;
}
​
/*运行结果:
linux@ubuntu:~/Linux_c/day04$ gcc demo4.c -Wall
linux@ubuntu:~/Linux_c/day04$ ./a.out 
1 s1 90.00
2 s2 89.00
3 s3 78.00
*/

4. 共用体及typedef

共用体:在C语言中,不同数据类型的数据可以使用共同的存储区域,这种数据构造类型称为共用体,简称共用,又称联合体。在定义说明和使用形式上与结构体相似。本质不同仅在于使用内存上。定义一个共用体类型的一般形式为:union 共用体名{成员表列;};例如:union gy{int i;char c;float f;};这里定义了一个共用体类型union gy,它由三个成员组成,这三个成员在内存中使用共同的存储空间。共用体变量在存储时总是按其成员中数据长度最大的成员占用内存空间。在共用体中起作用的成员是最后一次存放的成员,存入一个新的成员后原有的成员就失去作用。
/*案例:共用体内存空间测试 demo5*/
#include <stdio.h>
​
union gy
{char a;short b;int c;
};
​
​
int main(int argc,char *argv[])
{printf("%d %d %d\n",sizeof(char),sizeof(short),sizeof(int));printf("%d\n",sizeof(union gy));return 0;
}
/*运行结果:
linux@ubuntu:~/Linux_c/day04$ gcc demo5.c -Wall
linux@ubuntu:~/Linux_c/day04$ ./a.out
1 2 4
4
*/
typedef:在C语言中,允许使用关键字typedef定义新的数据类型,其语法如下:typedef <已有数据类型> <新数据类型>;

5. C语言的内存管理模型(内存管理一)

动态内存C/C++定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区即堆区代码区顾名思义,存放代码的,一般是只读的。全局变量与静态变量区通常定义变量,编译器在编译时都可以根据该变量的类型知道所需空间大小,从而适当的为他们分配确定的存储空间。局部变量/栈区在栈上创建。在执行函数时,函数内部局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。动态存储区在程序运行时,系统根据运行时的要求进行内存分配。所有动态存储都在堆区中进行。从堆上分配,亦称动态内存分配。程序在运行的时候malloc申请任意多少的内存,程序员自己负责在何时用free释放内存。malloc/freevoid * malloc(size_t num)void free(void *p)-malloc函数本身并不识别要申请的内存是什么类型,它只关心总的字节数-malloc申请到的是一快连续的内存,有时可能会比所申请的空间大。有时会申请不到内存,返回NULL-malloc返回值的类型是void *,所以在调用malloc时要显式地进行类型转换,将void *转换成所需要地指针类型。-如果free的参数式NULL的话,没有任何效果-释放一块内存中的一部分是不被允许的
/*案例:malloc和free的使用demo6*/
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char *argv[])
{char * p;
​p = (char *)malloc(10 * sizeof(char));if (p == NULL){printf("malloc failed\n");return 0;}printf("p=%p\n",p);printf("input:");scanf("%s",p);printf("p=%s\n",p);
​free(p);return 0;
}
/*运行结果:
linux@ubuntu:~/Linux_c/day04$ gcc demo6.c -Wall
linux@ubuntu:~/Linux_c/day04$ ./a.out 
p=0x82d8008
input:20240803
p=20240803
*/

6. 动态内存(内存管理二)

malloc/free注意事项:删除一个指针p(free(p);),实际意思是删除了p所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除p本身,释放堆空间后,p成了空悬指针。malloc于free是配对使用的,free只能释放堆空间。如果malloc返回的指针值丢失,则分配的堆空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另外分配。动态内存分配的时候要注意其生命周期。它并不依赖于建立它的作用域,比如在函数中建立的动态对象在函数返回后仍可使用。野指针:不是NULL指针,是指向已被释放内存的指针。成因主要有:指针变量没有被初始化指针p被free之后,没有置为NULL指针操作超越了变量的作用范围。
/*综合案例:demo7*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
​
#define N 20
​
typedef struct student{int no;char name[N];float score;
}Stu;
​
Stu * get_info(){Stu * p;
​if((p = (Stu *)malloc(sizeof(Stu))) == NULL){printf("malloc failed\n");return NULL;}
​p->no = 1;strcpy(p->name, "Tom");p->score = 90;
​return p;
}
​
int main(int argc,char *argv[])
{Stu * s;
​if ((s = get_info()) == NULL)return 0;printf("Student info:%d %s %.2f\n",s->no,s->name,s->score);
​free(s);s = NULL;
​return 0;
}
​
/*运行结果:
linux@ubuntu:~/Linux_c/day04$ gcc demo7.c -Wall
linux@ubuntu:~/Linux_c/day04$ ./a.out 
Student info:1 Tom 90.00
*/

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Informer模型复现项目实战

加入会员社群&#xff0c;免费获取本项目数据集和代码&#xff1a;点击进入>> 1. 项目简介 A034-Informer模型复现项目实战的目标是通过复现Informer模型&#xff0c;帮助理解其在时间序列预测中的实际应用和效果。该项目基于深度学习模型Informer&#xff0c;这是一种针…

科研绘图系列:R语言连线点图(linechart dotplot)

文章目录 介绍加载R包导入数据数据预处理画图组合图形导出数据系统信息介绍 不同物种的强度和微生物的组成情况 加载R包 library("here") library("tidyverse") library("reshape2") library("vegan")

如何获取一个返回Promise<T>的函数的“T“的类型

type ThenArg<T> T extends Promise<infer U> ? U : never export type GenByStaTypeAndHfRsType ThenArg<ReturnType<typeof genByStaTypeAndHf>> 这样一来&#xff0c;虽然返回了Promise<T>&#xff0c;我们没定义T的情况下&#xff0c;也可…

揭秘大模型背后的神秘力量:算力、数据与算法的“黄金三角”

目录 揭秘大模型背后的神秘力量:算力、数据与算法的“黄金三角” 一、算力:大模型的超级引擎 二、数据:大模型的智慧源泉 三、高性能算法:大模型的智慧大脑 结语:黄金三角的共鸣 揭秘大模型背后的神秘力量:算力、数据与算法的“黄金三角” 在人工智能的浩瀚星空中,…

基于Ambari搭建hadoop生态圈+Centos7安装教程V2.0优化版(本篇博客写的较为详细,可能比较多,请耐心看)

当我们学习搭建hadoop的时候&#xff0c;未免也会遇见很多繁琐的事情&#xff0c;比如很多错误&#xff0c;需要解决。在以后公司&#xff0c;也不可能让你一个一个搭建hadoop&#xff0c;成千上万的电脑&#xff0c;你再一个个搭建&#xff0c;一个个报错&#xff0c;而且每台…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

苹果和香蕉联合食用,益处最大,能控制血压水平,高血压死亡风险降低 40%!

文章目录 引言苹果和香蕉有助于调节血压知识扩展引言 2024年,大连医科大学第二附属医院等多家机构的研究人员刊发在《营养学前沿》杂志的一项研究发现:高血压患者中常吃(每周吃 3~6 次)香蕉或苹果的人,全因死亡率降低 24%~40%;而当患者对两种水果摄入频率都较高(每周吃…

Ubuntu18升级cmake和python

Ubuntu18升级cmake和python 1、升级cmake至3.22.12、升级python至3.82.1 安装依赖包2.2 添加deadsnakes PPA源2.3 安装python3.82.4 将python各版本添加到update-alternatives2.5 配置python3默认指向python3.82.6 测试python3版本2.7 配置python默认指向python32.8 测试python…

从趋势到常态:TikTok定制化产品的崛起与变革

随着数字化和TikTok的发展&#xff0c;定制化产品在消费者日常生活中愈发普及&#xff0c;逐渐从一种时尚潮流转变为常态。这一转变不仅改变了消费者的购物方式&#xff0c;也重塑了市场的供需关系、产品设计理念和商业模式。本文Nox聚星将和大家探讨TikTok定制化产品的未来发展…

Windows系统及Ubuntu系统安装Java

Java语言简介 Java是一种高级编程语言&#xff0c;Java语言的创始可以追溯到1990年代初&#xff0c;当时任职于Sun Microsystems&#xff08;后来被甲骨文公司收购&#xff09;的詹姆斯高斯林&#xff08;James Gosling&#xff09;等人开始开发一种名为“Oak”(名字来源于詹姆…

大模型时代:AI引领企业创新升级的全面爆发

人工智能&#xff08;AI&#xff09;正在以惊人的速度改变企业的运营模式&#xff0c;成为企业效率提升与创新的强大驱动力。随着AI技术的不断发展&#xff0c;企业正面临前所未有的机遇与挑战&#xff0c;如何有效利用这些技术已成为决定企业未来成败的关键。 首先&#xff0c…

抖音生活服务入局攻略曝光!普通人也能抓住风口!

当前&#xff0c;抖音生活服务的热度持续飙升&#xff0c;让不少人都有了入局的打算&#xff0c;与之相关的各类话题如抖音生活服务的入局途径有哪些等也因此成为了人们热议的对象。而从这些话题的讨论情况来看&#xff0c;绝大多数讨论者只知道抖音生活服务火爆&#xff0c;却…

基于SpringBoot和协同过滤算法的电商购物平台

文未可获取一份本项目的java源码和数据库参考。 选题的目的和意义&#xff1a; 在今天的科技发展现状中&#xff0c;所体现出的高速发展的信息技术&#xff0c;人们的生活水平及生活方式也随之发生着变化&#xff0c;以往人们已经习惯了多年养成的购物习惯&#xff0c;那就是到…

无人机之工作温度篇

无人机的工作温度是一个相对复杂的问题&#xff0c;因为它受到多种因素的影响&#xff0c;包括无人机的类型&#xff08;如民用、军用&#xff09;、设计规格、应用场景以及环境条件等。以下是对无人机工作温度范围的详细解析&#xff1a; 一、正常工作温度范围 一般来说&…

结合HashMap与Java 8的Function和Optional消除ifelse判断

shigen坚持更新文章的博客写手&#xff0c;记录成长&#xff0c;分享认知&#xff0c;留住感动。个人IP&#xff1a;shigen 在文章的开头我们先从这些场景进入本期的问题&#xff1a; 业务代码中各种if-else有遇到过吗&#xff0c;有什么好的优化方式&#xff1b;java8出来这么…

可编辑PPT | 能源企业数字化框架、数字化运营及数字化平台建设方案

项目背景及需求理解 首先提出了全球能源互联网的概念&#xff0c;强调了清洁能源和电能替代的重要性&#xff0c;并介绍了德国工业4.0战略以及泛在电力物联网的创新。文档探讨了信息化与工业化的深度融合&#xff0c;以及云计算、大数据、物联网和移动应用等新技术在能源行业的…

超详细超实用!!!AI编程之cursor编写一个官网(二)

云风网 云风笔记 云风知识库 一、新建html文件 选中添加index.html,输入编写官网要求&#xff0c;自动生成代码&#xff0c;先来个简单的。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"…

博图安装(版本:V18)

目录 一、软件安装 Ⅰ、博图编程软件安装 Ⅱ、仿真环境安装 二、许可证安装 安装教程 工作中常用的是编程软件&#xff0c;组态软件以及仿真&#xff0c;编程软件和组态软件是一起的&#xff0c;因此先演示编程软件的安装 软件安装总共分为两部分&#xff0c;安装软件和安…

对比评测5款实用在线翻译工具,包括有道在线翻译

大家好&#xff0c;今天咱们来聊聊在线翻译工具。在这个信息爆炸的时代&#xff0c;语言不再是沟通的障碍&#xff0c;多亏了这些强大的翻译神器。今天&#xff0c;我将带大家比较五款热门的在线翻译工具&#xff0c;究竟谁更胜一筹呢&#xff1f;让我们一探究竟&#xff01; …

STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器

目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…