自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(31)
  • 资源 (3)
  • 收藏
  • 关注

原创 C#中protobuf-net的编码结构及使用方法

C#中protobuf-net的编码结构及使用方法protobuf-net简介ProtoBuf编码原理编码结构解析一个编码结果使用方法参考资料

2022-08-09 10:25:18 2302 1

原创 Mac下QT Creator 使用QT Widgets Application模版生成的项目无法在本机运行解决方案

Mac下QT Creator 使用QT Widgets Application模版生成的项目无法在本机运行解决方案系统版本:Mac os Monterey 12.3.1QT Creator版本:5.14.2#include <QApplication>//程序入口int main(int argc, char *argv[]){ QApplication a(argc, argv); //添加这个语句 qputenv("QT_MAC_WANTS_LAYER",

2022-04-19 10:32:11 526

原创 C语言变量的存储类别和生存期

C语言变量的存储类别和生存期我们知道,变量是有数据类型的,用来说明他占用多大的内存空间,可以进行什么操作。除了数据类型,变量还有一个属性,称为“存储类别”。存储类别就是变量在内存中的存放区域。在进程的地址空间中,常量区、全局数据区和栈区都可以用来存放变量的值。常量区和全局数据区的内存在程序启动时就已经由操作系统分配好,占用的空间固定,程序运行期间不再改变,程序运行结束后才由操作系统释放;他可以存放全局变量、静态变量、一般常量和字符串常量。栈区的内存在程序运行期间由系统根据需要来分配(使用到变量才分配

2021-12-17 17:25:16 1760 1

原创 内存泄露(以c语言为例)

内存泄露使用malloc()、calloc()、realloc()动态分配的内存,如果没有指针指向他,就无法进行任何操作,这段内存会一直被程序占用,知道程序运行结束由操作系统回收。请看下面代码:#include <stdio.h>#include <stdlib.h>int main(){ char *p = (char*)malloc(100 * sizeof(char)); p = (char*)malloc(50 * sizeof(char));

2021-12-17 14:53:06 4242 1

原创 C语言野指针以及非法内存操作

C语言野指针以及非法内存操作如果一个指针指向的内存没有访问权限,或者指向一块已经释放掉的内存,那么就无法对该指针进行操作,这样的指针称为野指针(Wild Pointer)。指向没有访问权限的内存请看下面的代码:#include <stdio.h>int main(){ char *str; gets(str); puts(str); return 0;}在GCC下运行,输入一个字符串后会提示段错误(Segment Fault)。在VS下运行,输入一

2021-12-17 14:30:40 2353 1

原创 malloc函数背后的实现原理 -- 内存池

malloc函数背后的实现原理 – 内存池相对于栈而言,堆这片内存面临着一个稍微复杂的行为模式:在任意时刻,程序可能发出请求,要么申请一段内存,要么释放一段已经申请过的内存,而且申请的大小从几个字节到几个GB都有可能,我们不能假设程序一次申请多少堆空间,因此,堆的管理显得较为复杂。那么,使用malloc()在堆上分配内存到底是如何实现的呢?一种做法是把malloc()的内存管理交给系统内核去做,既然内核管理着进程的地址空间,那么如果它提供一个系统调用,可以让malloc()使用这个系统调用去申请内存,

2021-12-17 13:30:10 342

原创 C语言动态内存分配

C语言动态内存分配在进程的地址空间中,代码区、常量区、全局数据区的内存在程序启动时就已经分配好了,他们大小固定,不能由程序员分配和释放,只能等到程序运行结束由操作系统回收。这称为静态内存分配。栈区和堆区的内存在程序运行期间可以根据实际需求来分配和释放,不用在程序刚启动时就备足所有内存。这称为动态内存分配。使用静态内存的优点是速度快,省区了向操作系统申请内存的时间,缺点就是不灵活,缺乏表现力,例如不能控制数据的作用范围,不能使用较大的内存。而使用动态内存可以让程序对内存的管理更加灵活和高效,需要内存就立

2021-12-16 11:54:13 211

原创 栈溢出攻击的原理

栈溢出攻击的原理先看一个例子:#include <stdio.h>int main(){ char str[10] = {0}; gets(str); printf("str: %s\n", str); return 0;}在main()函数内部定义一个数组,并通过get()为他赋值。在VS2010 Debug模式下运行程序,当输入的字符不超过10个时,可以正确输出。但是当输入的字符过多时,就会出现运行时错误。例如输入“012345678901234

2021-12-15 17:17:04 1821

原创 一个实例深入了解函数进栈出栈过程

一个实例深入了解函数进栈出栈过程我们之前提到了函数的活动记录,这里我们就以VS2010 Debug模式为例来深入分析一下。先看一段代码:void func(int a, int b){ int p =12, q = 345;}int main(){ func(90, 26); return 0;}函数使用默认的调用惯例cdecl,即参数从右到左入栈,由调用方负责将参数出栈。函数的进栈出栈过程如下图所示:函数进栈以下几步为函数进栈过程:main()是主函数,

2021-12-09 17:50:22 3029 2

原创 一个函数在栈上的形式、函数的调用惯例

一个函数在栈上的形式、函数的调用惯例函数的调用和栈是分不开的,没有栈就没有函数调用,我们来了解一下函数在栈上是如何被调用的。栈帧/活动记录当函数发生调用时,会将函数运行需要的信息全部压入栈中,这常常被称为栈帧(Stack Frame)或活动记录(Activate Record)。活动记录一般包括以下几个方面的内容:1)函数的返回地址,也就是函数执行完成后从哪里开始继续执行后面的代码。例如:int a, b, c;func(1, 2);c = a + b;站在C语言的角度看,func()函数

2021-12-09 13:50:48 925

原创 栈(Stack)、栈溢出问题

栈(Stack)、栈溢出问题在Linux、Windows下C语言内存布局(内存模型)中曾经说到程序的虚拟地址空间分为多个区域。栈(Stack)可以存放函数参数、局部变量、局部数组等作用范围在函数内部的数据,他的用途就是完成函数的调用。栈内存由系统自动分配和释放:发生函数调用时就为函数运行时用到的数据分配内存,函数调用结束后就将之前分配的内存全部销毁。所以局部变量、参数只在当前函数中有效,不能传递到函数外部。栈的概念在计算机中,栈可以理解为一个特殊的容器,用户可以将数据依次放入栈中,然后再将数据按照相

2021-12-08 13:16:04 1098

原创 用户模式和内核模式

用户模式和内核模式首先我们要解释一个概念–进程(Process)。简单来说,一个可执行程序就是一个进程,前面我们使用C语言编译生成的程序,运行后就是一个进程。进程最显著的特点就是拥有独立的地址空间。严格来说,程序是存储在磁盘上的一个文件,是指令和数据的集合,是一个静态的概念;进程是程序加载到内存运行后的一些活动,是一个动态的概念。前面我们在说到地址空间时,一直说“程序的地址空间”,这其实是不严谨的,应该说“进程的地址空间”。一个进程对应一个地址空间,而一个程序可能会创建多个进程。内核模式和用户模式

2021-11-25 15:07:06 734

原创 Linux、Windows下C语言内存布局(内存模型)

Linux、Windows下C语言内存布局(内存模型)在虚拟地址空间及编译模式中提到,虚拟地址空间在32位环境下大小为4GB,在64位环境下大小为256TB,那么,一个C语言程序的内存在整个地址空间中是如何分布的呢?数据在哪里?代码在哪里?为什么要这样分布?内核空间和用户空间对于32位环境,理论上程序可以拥有4GB的独立空间,我们在C语言中使用到的变量、函数、字符串等都会对应内存中的一块区域。但是,在这4GB的地址空间中,要拿出一部分给操作系统内核使用,应用程序无法直接访问这一段内存,这一部分内存地

2021-11-23 15:56:06 2904

原创 MMU部件以及对内存权限的控制

MMU部件以及对内存权限的控制通过页表完成虚拟地址和物理地址映射时,要经过多次转换,还要进行计算,如果由操作系统来完成这项工作,那将会成倍降低程序性能,得不偿失,所以这种方式是不现实的。MMU在CPU内部,有一个部件叫做MMU(Memory Management Unit,内存管理单元),由它来负责将虚拟地址映射为物理地址,如下图所示:在页映射模式下,CPU发出的是虚拟地址,也就是我们在程序中看到的地址,这个地址会先交给MMU,经过MMU的转换以后才能变成物理地址。即便是这样,MMU也要访问好几

2021-11-23 11:19:07 762

原创 内存分页,完成虚拟地址的映射。页表与页目录又表示什么?

内存分页,完成虚拟地址的映射。页表与页目录又表示什么?虚拟地址与物理地址转换关于虚拟地址和物理地址映射有很多思路,我们可以假设以程序为单位,把一段与程序运行所需要的同等大小的虚拟空间映射到某段物理空间。例如程序A需要10MB内存,虚拟地址的范围是从0X00000000到0X00A00000,假设他被映射到一段同等大小的物理内存,地址范围从0X00100000到0X00B00000,即从虚拟空间中的每一个字节对应于物理空间中每一个字节。程序运行时,他们的对应关系如下图所示:[外链图片转存失败,源站可

2021-11-21 16:51:16 1321

原创 内存对齐,提高寻址效率

内存对齐,提高寻址效率计算机内存是以字节(Byte)为单位划分的,理论上CPU可以访问任意编号的字节,但实际情况并非如此。CPU通过地址总线来访问内存,一次能处理几个字节的数据,就命令地址总线读取几个字节的数据。例如,32位的CPU一次能处理4个字节的数据,那么每次就从内存读取4个字节的数据。少了浪费主频,多了也没有用。64位的处理器也是这个道理,每次读取8个字节。以32位CPU位例,实际寻址的步长为4个字节,也就是只对编号为4的倍数内存寻址,例如0、4、8、12、1000等,而不会对编号1、3、11

2021-11-08 20:00:52 614 1

原创 虚拟地址空间、CPU的数据处理能力、编译模式

虚拟地址空间、CPU的数据处理能力、编译模式所谓虚拟地址空间,就是程序可使用的虚拟地址有效范围。虚拟地址和物理地址的映射关系由操作系统决定,相应的,虚拟地址空间的大小也由操作系统决定,但还会收到编译模式的影响。我们先说说CPU,再看看编译模式,来了解编译器是如何配合CPU来提高程序运行速度的。CPU的数据处理能力CPU是计算机的核心,决定了计算机的数据处理能力和寻址能力,也即决定了计算机的性能。CPU一次(一个时钟内)能处理数据的大小由寄存器的位数和数据总线的宽度(也就是由多少根数据总线)决定,我们

2021-11-06 16:09:44 680

原创 虚拟内存是什么?我们在程序中看到的内存地址大多是假的?使用虚拟地址的高处是什么?

虚拟内存是什么?我们在程序中看到的内存地址大多是假的?使用虚拟地址的高处是什么?在C语言中,指针变量的值就是一个内存地址,&运算符的一个作用也是取变量的地址,如:#include <stdio.h>#include <stdlib.h>int a = 1, b = 255;int main(){ int *pa = &a; printf("pa = %#X, &b = %#X\n", pa, &b); system("

2021-11-04 20:08:15 204

原创 初识CPU,一个程序在计算机中是如何运行的

初识CPU,一个程序在计算机中是如何运行的初识CPU我们知道,程序是保存在硬盘中的,如果想要运行程序,就要将他载入内存,而CPU也被设计为只能从内存中读取数据和指令。对于CPU来说,内存只不过是个存放指令和数据的地方,并不能在内存中完成计算功能。如果我们要计算 a = b + c,必须将a、b、c都读取到CPU中才能进行加法运算。CPU是个复杂的计算机部件,内部又包含了很多小零件,如图:运算单元是CPU的大脑,负责加减乘除、比较、位移等运算工作,每种运算都有对应的电路支持,速度很快。寄存器(R

2021-11-04 16:06:37 713

原创 C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符

C语言学习(十二)C语言中的字符(宽字符与窄字符)、从字符谈谈C语言的编码、转义字符字符串是多个字符的集合,他们由" "包围,如"http://www.baidu.com"。字符串中的字符在内存中按照次序、紧挨着排列,整个字符串占用一块连续的内存。当然,字符串也可以只包含一个字符,例如"A",不过一般我们使用专门的字符类型来处理这种只包含一个字符的情况。常用到的字符类型是char,他的长度为1,只能容纳ASCII码表中的字符,也就是英文字符。如果想处理汉语、日语、汉语等,就需要使用其他的字符类型,c

2021-09-29 18:09:10 4755 6

原创 C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么?

C语言学习(十一)小数在内存中是如何存储的?定点数与浮点数各自的优势在哪?规格化浮点数与非规格化浮点数又表示什么?浮点数与定点数小数在内存中以浮点数形式存储。浮点数并不是一种数值分类,他和整数、小数、实数等不是同一个层面的概念。浮点数是数字(或者说是数值)在内存中的一种存储格式,他是和定点数相对的。C语言中规定使用定点数格式来存储short、int、long类型的整数,使用浮点数格式来存储float、double类型的小数。整数和小数在内存中存储的格式不一样。我们通常认为浮点数和小数是等价的,并没有

2021-09-28 17:21:50 3034 1

原创 C语言学习(十)C语言中的小数

C语言学习(十)C语言中的小数小数的表示方式小数分为整数部分和小数部分,他们之间用点号.分隔,如0.0、7.5、4.098、0.27、-987.333等都是合法小数,这是最常见的小数形式,我们称为十进制形式。此外,小时也可以采用指数形式,如3.2x103、0.0345x106、100.2323x10-6等。C语言同时支持以上两种小数形式。C语言中小数的指数形式为:aEn 或 aen其中a为尾数部分,是一个十进制的数字。n为指数部分,是一个十进制整数。e或者E是一个固定字符,用于分隔尾数和指数

2021-09-27 15:53:12 7097

原创 C语言学习(九)整数在内存中是如何存储的?数值溢出的本质是什么?从源头了解奇怪的整数输出问题

C语言学习(九)整数在内存中是如何存储的?数值溢出的本质是什么?从源头了解奇怪的整数输出问题目录C语言学习(九)整数在内存中是如何存储的?数值溢出的本质是什么?从源头了解奇怪的整数输出问题关于计算机中的加法和减法,设计计算机时是如何简化硬件电路的?原码、反码、补码原码反码补码总结采用补码存储是如何简化硬件电路的?上篇问题解析溢出的概念无符号数的取值范围有符号数的取值范围数值溢出关于计算机中的加法和减法,设计计算机时是如何简化硬件电路的?加法和减法是计算机中最基本的运算,计算机时时刻刻都离不开他们。所以

2021-09-27 14:35:15 444

原创 C语言学习(八)整数(int、short、long)的具体介绍、不同进制表示、输出,sizeof、unsinged的使用

整数(int、short、long)的具体介绍、不同进制表示、输出,sizeof、unsinged的使用int、short、long的用法及区别。为什么要用short、long?在现代操作系统中,int一般(注意,是一般)占用4个字节(Byte)的内存,共32位(bit)。如果不考虑正负数,当所有位都为1时,他的值最大,为232≈43亿。这是一个很大的数,实际开发中很少用到。而像1、99、12234等较小的数使用频率反而较高。使用4个字节保存较小的整数绰绰有余,会空闲出两三个字节来,这些字节就白白浪费

2021-09-23 14:35:07 20305

原创 C语言学习(七)C语言变量初识、简单了解变量如何放入内存中、在屏幕上输出各种类型数据、字符串中长文本的书写

C语言变量初识、简单了解变量如何放入内存中、在屏幕上输出各种类型数据、字符串中长文本的书写回顾、引入在我们了解变量前,先回顾一下之前提到的内容。在C语言学习(三)内存初识、数据在内存中的保存形式、程序载入内存中曾经提到过:数据是以二进制的形式存放在内存中的我们将8个比特(Bit)称为一个字节(Byte),并将字节作为最小的可操作单元我们不妨从最简单的整数开始说起,看看它是如何放到内存中去的。变量(Variable)现实生活中我们常常会找一个小箱子来存放物品,为了使其显得不那么的乱,也方便我

2021-09-17 17:09:06 671

原创 C语言学习(六)学习C语言前你要了解的知识!包括编译、IDE、C语言的标准等

目录(一)从Hello,World开始(二)第一个C语言程序, C语言的整体框架(三)输入法的选择(中/英),全角半角的区别(四)什么是源文件?(五)C语言的编译和链接编译(Compile)链接(Link)总结(六)C语言编译器(主流)桌面操作系统嵌入式系统(作为了解)(七)什么是IDE(集成开发环境)?(八)什么是工程/项目?工程类型/项目类型(九)哪款C语言编译器(IDE)适合初学者?Windows下推荐的IDELinux下推荐的IDEMac OS下推荐的IDE另外推荐(十)C语言的三套标准:C89、C

2021-09-07 16:48:45 1188

原创 C语言学习(五)学习C语言前你必须要明白的事情!

C语言究竟能做什么  对于大部分初学者来说,学习C语言的目的是希望做一名合格的程序员,开发出靠谱的软件来。但如如果我们在学习了C语言的基本语法后,发现他只能开发出黑底白字的DOS程序,完全没有漂亮的界面和生动的交互。那么,C语言究竟能干嘛呢?  其实,C语言本身是一门非常简单的语言,提供的实用功能不多,大多都要依靠操作系统、第三方库、单片机来完成。也就是说,只学习C语言,什么都做不了。  C语言是一门通用型语言,并没有针对某个领域进行优化。在实际项目中,C语言主要用于比较底层的开发,比如:Wind

2021-08-16 15:00:04 539

原创 C语言学习(四)ASCII、GB2312、GBK等编码以及Unicode等字符集

目录(一)简介(二)ASCII编码拉丁字母ASCII编码介绍ASCII码表ASCII码和C语言(三)GB2312编码和GBK编码,将中文存入计算机(一)简介之前我们说过,计算机是以二机制形式来存储的,他只认识0和1两个数字。我们在屏幕上看到的文字在存储前已经被转换成了二进制,在显示时也要根据二进制找到对应的字符。所以,特定的字符必然对应着固定的二进制,否则在转换时会造成混乱。那么,怎样将文字与二进制对应起来呢?这就需要一套规范,计算机公司和软件开发公司都要遵守,这样的一套规范就被称为字符集(Chara

2021-08-02 17:08:31 3902

原创 C语言学习(三)内存初识、数据在内存中的保存形式、程序载入内存

(一)内存与存储(硬盘)  首先要明确一点,内存不同于存储。内存中的数据存储在内存条中。而一般的存储,数据则保存在硬盘中。这里我只给出一些表象的区别,如果还想更深入的了解,请自行搜索,此篇所展示的重点不在于此。数据存储位置不同。内存中数据存放在内存条中,一般我们提到的存储则指的是硬盘中的存储读写数据的速度不同。内存条的读写速度比硬盘快的多数据保存方式不同。内存中存储的是临时数据,主要包括程序编码、程序运行时产生的数据、程序临时缓存、需要临时保存的数据(后续会持久保存在硬盘中)。临时数据,在有些程序

2021-07-26 20:06:23 1035

原创 C语言学习(二)令人费解的进制

目录(一)进制的概念(二)为什么要学习进制(三)各种进制的介绍及计算二进制1.介绍2.意义3.计算二进制加法二进制减法八进制1.介绍2.意义3.计算八进制加法八进制减法十六进制1.介绍2.表示方式3.意义4.计算十六进制加法十六进制减法(四)不同进制之间的转换将二进制、八进制、十六进制转换成十进制1. 整数部分2.小数部分3.更多转换成十进制的例子:将十进制转换成二进制、八进制、十六进制1.整数部分2.小数部分二进制和八进制、十六进制之间的转换1. 二进制整数和八进制整数之间的转换2. 二进制整数和十六进制

2021-07-19 00:28:53 501

原创 C语言学习(一)C语言能干什么?为什么要学习C语言?

C语言学习(一)前瞻

2021-07-16 14:49:04 2298

Simple Shader--Shader GraphHDRP

Unity HDRP支持的shader效果,包括流光、全息、溶解、雾等

2022-05-05

Speech Recognition System 1.0.4.unitypackage

Unity插件。语音识别(离线版)插件。支持中文、英文、俄语、法语、阿拉伯语等19种语言。支持多平台(PC、移动端)。

2021-08-18

ReflectInstaller.exe

Unity Reflect最新插件安装包,Unity官方版本,暂未发布。包含Revit导出三维模型到Unity Reflect Review以及导入Unity二次开发必备插件安装包

2021-08-10

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除