
C/C++
文章平均质量分 89
jiajia4336
这个作者很懒,什么都没留下…
展开
-
图解函数调用过程
函数调用是编程语言都有的概念,也许你听说过函数调用栈,但是大家都知道函数调用是如何完成的吗?我们为什么要了解这个过程: 对于程序运行机制中的数据结构和实现的了解,对自己开发程序有着启发作用 碰到一些疑难杂症的时候,比如函数栈溢出了或者函数栈破坏了,如何从蛛丝马迹中寻找问题的原因。 了解栈溢出可能带来的危害,黑客也许会利用栈溢出的漏洞进行攻击。 这篇博文我们一起来对函数调用的过程进行探究。程序样例下面是这篇博文要用到的一个样例程序:程序在main中调用了FunAdd函数。转载 2021-06-02 14:59:45 · 3281 阅读 · 0 评论 -
GCC编译过程与动态链接库和静态链接库
1. 库的介绍库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。库有两种:静态库(.a、.lib)和动态库(.so、.dll)。 windows上对应的是.lib .dll linux上对应的是.a .so在这里先介绍下Linux下的gcc编译的几个选项g++ -c hellospeak.cpp会将hellospeak.cpp转载 2020-11-19 08:51:53 · 947 阅读 · 0 评论 -
常用gdb命令
常用gdb命令gcc -g main.c //在目标文件加入源代码的信息gdb a.out (gdb) start //开始调试(gdb) n //一条一条执行(gdb) step/s ...原创 2020-04-12 13:12:09 · 290 阅读 · 0 评论 -
常用Vim命令总结
Ctrl+f 屏幕向下移动一页 相当于 page downCtrl+b 屏幕向上移动一页 相当于page up0或者功能键home 移动到这一行的最前面的字符处$或者End 移动到这一行的最后面的字符处G 移动到文档的最后一行gg 移动到文档的第一行n+Enter n为数字,光标向下移动n行--------------------------------...原创 2020-04-12 13:08:04 · 202 阅读 · 0 评论 -
eclipse编辑、查看C++代码,并实现跳转
用eclipse去编辑、查看C++代码,代码可跳转,不需要编译,不需要Money安装包:jdk-13.0.2_windows-x64_bin.exeeclipse-cpp-2019-06-R-win32-x86_64.zip安装jdk,默认安装,一路next。 解压eclipse压缩包,免安装,在执行eclipse.exe之前,编辑eclipse.ini,加上下面这几段:-vm...原创 2020-03-18 12:44:08 · 2946 阅读 · 0 评论 -
通俗易懂----C++前置声明
大型开发都会遇到的问题随着软件规模的扩大,包含在一个工程中的模块的数量在不断增长,模块之间的依赖关系也日益复杂。这里只举一个相对简单的例子:一个包含2个类,5个文件的工程。ImportantClass.h头文件中声明了构造函数,doWork成员函数和数据成员buffer。ImportantClass.cppcpp文件中为构造函数和doWork提供了最简单的实现。...转载 2020-03-04 12:57:50 · 456 阅读 · 0 评论 -
读C++11新特性总结 大部分为转载,小部分为原创代码
来自面向对象思考的个人blog:https://blog.youkuaiyun.com/craftsman1970/article/details/797179441:longlong数据类型long long是在C++11中重新定义的,标准规定它最小是64bit在这之前为了提供超过32bit的整数,各个开发环境(编译器)分别定义了各自的64bit整数类型。结果当然就是影响了代码地兼容性。现在好了...转载 2020-02-20 13:54:10 · 707 阅读 · 0 评论 -
C++智能指针循环引用问题分析
C++11中引入了三种智能指针,分别是shared_ptr、weak_ptr和unique_ptr智能指针的作用智能指针可以帮助我们管理动态分配的堆内存,减少内存泄漏的可能性手动管理堆内存有引起内存泄漏的可能,比如这段代码try { int* p = new int; // Do something delete p;} catch(...) { //...转载 2019-11-25 09:55:32 · 303 阅读 · 0 评论 -
C语言18个经典小程序(二)
7、/*通过键盘输入3名学生4门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩。要求所有成绩均放入一个4行5列的数组中,输入时同一人数据间用空格,不同人用回车 其中最后一列和最后一行分别放每个学生的平均成绩、每门课程的平均成绩及班级总平均分。*/#include #include main(){ float a[4][5],sum1,sum2; inti原创 2013-03-12 09:09:35 · 7051 阅读 · 0 评论 -
C语言18个经典小程序(三)
13、/*在一个字串s1中查找一子串s2,若存在则返回子串在主串中的起始位置,不存在则返回-1。*/#include "stdafx.h"#include int search(const char*,const char*);int main(int argc, char* argv[]){char* s1="thisis";char* s2="is";p原创 2013-03-12 09:10:29 · 1826 阅读 · 0 评论 -
探讨C语言中的回调函数
回调函数是一个程序员不能显式调用的函数;通过将回调函数的地址传给 调用者从而实现调用。回调函数使用是必要的,在我们想通过一个统一接口实现不 同的内容,这时用回掉函数非常合适。比如,我们为几个不同的设备分别写了不同 的显示函数:void TVshow(); void ComputerShow(); void NoteBookShow()...等 等。这是我们想用一个统一的显示函数,我原创 2013-04-10 21:31:41 · 685 阅读 · 0 评论 -
c++ 头文件包含问题-include&class
在一些大的工程中,可能会包含几十个基础类,免不了之间会互相引用(不满足继承关系,而是组合关系)。也就是需要互相声明。好了,这时候会带来一些混乱。如果处理得不好,会搞得一团糟,根据我的经验,简单谈谈自已的处理办法:编码时,我们一般会尽量避免include头文件,而是采用声明class XXX。 但有时候还是必须用Include头文件,那么,两者的划分在于什么呢?应该是很明确的,但书上原创 2013-05-30 19:57:23 · 4652 阅读 · 0 评论 -
深拷贝和浅拷贝
浅拷贝就是对象的数据成员之间的简单赋值,如你设计了一个没有类而没有提供它的复制构造函数,当用该类的一个对象去给令一个对象赋值时所执行的过程就是浅拷贝,如:class A { public: A(int _data) : data(_data){} A(){}private: int data; };int main() { A a(5); b = a; //转载 2013-07-15 17:06:52 · 626 阅读 · 0 评论 -
C++11常见语法总结
Override 关键字:明确的表示一个函数是对基类中一个虚函数的重载。class G{public:virtualvoid func(int);};class H: G{public:virtualvoid func(double) override; //compilation error};当处理到H::func()声明时,编译器会 在一...原创 2017-08-22 08:58:03 · 677 阅读 · 0 评论 -
C++11之 unique_ptr
在C++11中加入了很多的新特性,unique_ptr一枝独秀,对于动态分配的内存对象,它简单有效。虽然它不是万能的,但是它做的已经够好了:利用简单的语法便可以管理动态分配的对象。 基本语法:unique_ptr 是一个模板类,你可以很简单地构造一个unique_ptr的对象,如下: ?1std::uniq转载 2017-08-29 13:42:05 · 458 阅读 · 0 评论 -
使用初始化捕获来把对象移动到闭包
有时候,你想要的既不是值捕获,也不是引用捕获。如果你想要把一个只可移动对象(例如,std::unique_ptr或std::future类型对象)放入闭包中,C++11没有办法做这事。如果你有个对象的拷贝操作昂贵,但移动操作廉价(例如,大部分的标准容器),然后你需要把这个对象放入闭包中,那么比起拷贝这个对象你更愿意移动它。但是,C++11还是没有办法完成这事。但那是C++11,C++14就转载 2017-08-29 15:25:16 · 393 阅读 · 0 评论 -
C++笔记 不断更新
pair的用法pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是使用struct不是class,所以可以直接使用pair的成员变量。2 make_转载 2017-10-31 11:30:39 · 252 阅读 · 0 评论 -
C语言18个经典小程序(一)
1、/*输出9*9口诀。共9行9列,i控制行,j控制列。*/#include "stdio.h"main(){int i,j,result; for(i=1;i {for(j=1;j { result=i*j; printf("%d*%d=%-3d",i,j,result);/*-3d表示左对齐,占3位*/原创 2013-03-12 09:08:17 · 1658 阅读 · 0 评论 -
swap(a,b)值交换的4种方法
这篇文章所要表述的内容的确很简单,写之前,我纠结了很久:写与不写。平常swap(a,b)值交换,我们基本都是使用第一种方法,对于数学较好的人,可能会想到第二种方法,想到时,一定感觉很好,。对于汇编或对位有理解的人,可能会想到第三种方法,这个方法很妙。但,真正促使我写这篇文章的,还是第四种方法,妙,真的很妙,先(b = a),我是真没想到,我想,这么好的东西,尽管简单,但值得发表,以此共享。转载 2013-02-25 16:54:01 · 1002 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(三)
第四章 流程控制1.流程图(当初学的时候觉得很麻烦,现在觉得对整理编程思路帮助还是很大)2.顺序结构 3.分支结构 1)形式 ( else 总是与其前面最近的 if 配对 ) A . if(表达式) 语句; B. if(表达式) 语句1;转载 2013-01-18 15:27:36 · 487 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(五)
第六章 数组和字符串 Ps:将同种类型数据进行有序组织以便于管理一、一维数组 类型说明符 数组名[ 常量表达式 ]; 1. 数组在定义的时候,数组的大小一定要确定: 这样是错误的! 但在访问数组元素的时候可以是数值也可以是是表达式:转载 2013-01-18 15:30:09 · 508 阅读 · 0 评论 -
C++ virtual虚函数总结
c++是一门面向对象的语言,但是它和c#,java不同,它没有反射机制。没有反射机制使得c++在语言的一些设计方面与其他语言有点不一样,主要体现在智能化方面,许多东西得程序员明确指定,例如本文要讲的virtual关键字。virtual是在运行时才体现的,而c++在运行时无法使用反射来确定当前类的父类是否有此方法,此方法是否被重载等信息,所以必须在写代码时用virtual来明确指明,然后通过编译器做转载 2013-02-01 23:21:09 · 949 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(七)
第八章 预处理cpp源文件——(预编译)》预处理文件——(编译)》目标文件——(连接)》可执行文件预处理:源文件在进行编译时第一遍扫描之前做的工作(词法分析和语法分析)程序员与预处理器进行交互的工具是一种被称作预处理器指示的命令(一些以“#”号开头的单行命令)编译的源文件test.cpp[cpp] view plaincopy转载 2013-01-18 15:32:15 · 758 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(八)
第九章 结构体和共用体一、结构体由一系列具有相同类型或不同类型的的数据构成的数据集合(但不能包含函数类型)1.定义 1)第一种形式[cpp] view plaincopystruct 结构体类型名 { 数据类型名1 成员名1; ......... 数据类型名2转载 2013-01-18 15:32:57 · 491 阅读 · 0 评论 -
《C语言参悟之旅》 -读书笔记(一)
最近在看《C语言参考之旅》,感觉这本书不错,作者有用心去写,也写出了一些实际开发过程中雪要注意的细节,和高校教师所编的书还是有一定区别,初看好像很简单,但仔细看还是有一定的深度,适合掌握了一些基本语法的 C语言学习者学习,本文记下了阅读过程中自己认为比较重要而在学校教材里没有讲透彻的地方摘录下来转载 2013-01-18 15:24:36 · 1022 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(二)
第三章 运算符、表达式和语句1.在表达式中使用( )是一种很好的编程方式能大大提高程序的可读性如: 标准C中对很多运算符的求值顺序都没有进行明确规定,实现顺序与具体实现有关( 编译环境) -a +b / 2 -转载 2013-01-18 15:26:15 · 610 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(四)
第五章 函数Ps: 函数的语法本身并不复杂,真正需要编程者去理解和体会的往往是如何用函数来拆解问题,使用函数的水平直接反映在编程者能够组织多大规模的程序1.C语言中的main( )函数 C程序总是从main( )函数开始执行的,main( )函数可以调用任何C语言函数,但任何C语言函数都不能调用main( )函数,main( )函数通常在其所属的程转载 2013-01-18 15:29:16 · 522 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(九)
第十章 文件文件就是一组相关元素或数据的有序集合,每个集合都有一个符号化的指代(文件名)文件通常都被存在外部存储器上,它只在需要使用时被调入内存一.相关概念:1.主要分类 1). 普通文件:驻留在磁盘或其他外部介质上的一些有序数据集, 2).设备文件(逻辑上的文件): 和主机相连的各种外部设备:如显示器、打印机、键盘2.流的概念转载 2013-01-18 15:33:34 · 512 阅读 · 0 评论 -
内存编程的几点规则
规则1-用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。规则2-不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。规则3-避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。规则4-动态内存的申请与释放必须配对,防止内存泄漏。规则5-用free或delete释放了内存之后,立即原创 2013-01-20 12:24:36 · 663 阅读 · 0 评论 -
同步函数与异步函数
文章出处:http://blog.163.com/lyzaily@126/blog/static/42438837200952751954922/ 1. 同步函数与异步函数 什么是同步函数? 什么是异步函数? 它们在线程中执行时会对线程有何影响? 一个线程如何与一个异步执行的函数进行同步?转载 2013-01-21 22:50:36 · 748 阅读 · 0 评论 -
内存编程学习(不间断更新)
内存分配方式1.从静态存储区域分配内存在程序编译的时候就已经分配好。例如全局变量,static变量。2.在栈上创建在执行函数时,函数的参数值,函数内局部变量的存储单元都可以在栈上创建。3.从堆上分配,亦称动态内存分配程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。int a = 0;原创 2013-01-22 16:16:09 · 799 阅读 · 0 评论 -
二维数组和指针
二维数组和指针⑴ 用指针表示二维数组元素。要用指针处理二维数组,首先要解决从存储的角度对二维数组的认识问题。我们知道,一个二维数组在计算机中存储时,是按照先行后列的顺序依次存储的,当把每一行看作一个整体,即视为一个大的数组元素时,这个存储的二维数组也就变成了一个一维数组了。而每个大数组元素对应二维数组的一行,我们就称之为行数组元素,显然每个行数组元素都是一个一维数组下面我们讨论指针转载 2013-03-05 17:09:21 · 721 阅读 · 0 评论 -
关于 (&a+1) 的困惑
在一次笔试过程中遇到的一个填空题,当时有些迷糊,回来上网查资料之后将解析贴出来共享一下。请先看以下程序:Q:若 int a[5];则 &a+1 的含义是甚么?A:&a+1 不是表示a的地址(设为Ox0010)加1,变为0x0011. 由于a为包括5个int类型的数组,则"&a+1"中的"+1"表示为相当于"1"个a大小的空间(或成为偏转载 2013-03-05 17:20:46 · 770 阅读 · 0 评论 -
《C语言参悟之旅》-读书笔记(六)
第7章指针C语言编写的程序至今仍能和汇编语言程序相媲美,其中一个重要原因就是拥有一种数据类型——指针(内存操作)1.指针和地址 数据的访问方式——直接访问和间接访问间接访问方式 通过变量来访问( 计算机用一个别称(变量)来标识存储单元,计算机在寻找内存的数据时就要先把这个别称翻译成地址才行 )直接访问方式 通过地址来访问转载 2013-01-18 15:31:10 · 942 阅读 · 1 评论 -
常见面试题之C++ .
1. C++中struct与C语言中的struct有何区别在C语言中, struct仅用于定义复杂数据结构,也主是说它只能定义数据,它的成员只能是数据类型,不能直接定义方法函数。在C++中,struct除了C中的用途外,还可以像class一样,可以定义成员方法函数。2. struct与class的区别共同点:它们都可以定义面向对象中的类:定义成员数据和成员方法函数。转载 2013-02-22 11:03:17 · 504 阅读 · 0 评论 -
C/C++ 编码过程中防错的必要性及其方法
1.1 防错及其意义防错•就是预防错误的发生。•这里讨论的问题基本上代码防错。•这里讨论的防错实施者是编程人员,非测试人员;防错意义•提高产品质量•减少Bug的数量•增加程序健壮性•提高开发效率•通过防止错误的发生,检查排错的时间;一般来讲防错投入的价值要远远大于排错的投入•一个错误不仅仅会给(产生这个问题的)开发者的工作增加阻碍,而且往往会导原创 2013-01-19 12:30:42 · 1637 阅读 · 0 评论