
C
文章平均质量分 64
csshuke
这个作者很懒,什么都没留下…
展开
-
枚举(enum)/共用体(union)/结构体(struct)---详解
【代码】枚举(enum)/共用体(union)/结构体(struct)---详解。转载 2024-12-12 18:42:02 · 101 阅读 · 0 评论 -
C语言: 函数调用的开销
转载请注明来源 http://blog.youkuaiyun.com/imred/article/details/48865359 初学C语言的时候,我们有时会听说函数调用会有一定的开销,在进行了进一步学习之后,我们来看看原来听说的开销指的什么。 下面是两个非常简单的样例,就不作解释了: ...转载 2021-05-07 09:55:30 · 993 阅读 · 1 评论 -
C语言中volatile关键字的作用
一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变量缓存到寄存器;调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令。对常规内存进行优化的时候,转载 2021-04-16 09:35:41 · 267 阅读 · 0 评论 -
C语言 共享库(动态库)制作
文章目录 共享库简介 共享库制作 代码实现 创建共享库 链接使用共享库 小结 共享库简介共享库的本质就是将多个目标文件打包成一个文件。链接共享库就是在可执行文件中调用共享库中函数的指令处插入一些指令,在运行时通过执行这些指令来完成加载共享库以及计算出所调函数入口地址的动作。使用共享库的可执行文件占用磁盘和内存相对于静态库要小。共享库中的代码一旦被修改,只要函数接口不变,无需重新链接。使用共享库的可执行文件在运行时,需要依赖共享库.转载 2021-01-28 15:38:20 · 504 阅读 · 0 评论 -
C语言 静态库制作(亲测可行)
文章目录 静态库简介 静态库制作 代码实现 创建静态库 链接使用静态库 静态库简介静态库的本质就是将多个目标文件打包成一个库文件。链接静态库就是将库中被调用代码复制到可执行文件中。使用了静态库的可执行文件占用磁盘空间和内容空间都比较大,静态库中代码被修改后,需重新生成库文件并需重新链接库文件。使用静态库的可执行文件无需依赖静态库,静态库即使被删除,也可照常运行。执行效率比动态库相对要高。静态库的文件形式为:lib<库名>.转载 2021-01-28 14:30:05 · 396 阅读 · 1 评论 -
GCC全过程详解+剖析生成的.o文件
使用GCC编译一个.c文件影藏了哪些过程?GCC四步详解第一步:预处理(也叫预编译)gcc -E hello.c -o hello.i 或者 cpp hello.c > hello.i 【cpp是预编译器】 将所有#define删除,并且展开所有的宏定义 处理所有的条件预编译指令,如#if ...转载 2019-11-25 16:54:44 · 764 阅读 · 0 评论 -
new与malloc的区别以及实现方法
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/shanghairuoxiao/article/details/70337890new和malloc的内存分配在哪分配在堆上。也有说new是分配在自由存储区而malloc分配在堆上,自由存储区可以是堆也可以不是,具体要看new内部的实现。操作系统在堆上维护一个空闲内存链表,当需要分配内存的时候...转载 2018-09-13 11:19:28 · 304 阅读 · 0 评论 -
C语言:函数中参数的传值与传地址
任务代码: #include <stdio.h> void swap(int *a ,int *b)//按之前对指针认识,*a代表指针变量a,a存储的是地址,*a是地址的值。 { //但是可以看到下面传输过程中swap(&a,&b),取的是地址传输给了*a.看似是矛盾的! //这里着重注意特例!!!:函数的...转载 2018-09-13 12:26:21 · 981 阅读 · 0 评论 -
Linux多线程编程(一)---多线程基本编程
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/mybelief321/article/details/9377379线程概念 线程是指运行中的程序的调度单位。一个线程指的是进程中一个单一顺序的控制流,也被称为轻量级线程。它是系统独立调度和分配的基本单位。同一进程中的多个线程将共享该系统中的全部系统资源,比如文件描述符和信号处理等。一...转载 2018-09-10 22:59:31 · 186 阅读 · 0 评论 -
可以在没有main()的情况下编写C程序吗?
是的,你可以编写一个没有main()的C程序 。这是一个广受好评的“Hello World”程序,没有main()。 #include <stdio.h> extern void _exit (register int ); int _start (){ printf (“ Hello World \ n ”); _exit (0 ); }几乎每本书都教我们...转载 2018-09-10 12:25:37 · 2315 阅读 · 0 评论 -
C语言程序可以没有main函数
原文链接:http://www.wufangbo.com/175871/ 学习C语言的同学都知道,每个C程序要有一个main函数,程序从main函数开始执行,在main函数中结束。但事实上,C程序也可以没有main函数,或者说自己可以指定入口函数。下面这篇文章介绍了如何实现这一过程。这篇文章转自:http://www.codeweblog.com,作者不详。学习这个内容对程序设计没啥影响,...转载 2018-09-10 11:53:32 · 1471 阅读 · 0 评论 -
C语言面向对象编程(五):单链表实现
前面我们介绍了如何在 C 语言中引入面向对象语言的一些特性来进行面向对象编程,从本篇开始,我们使用前面提到的技巧,陆续实现几个例子,最后呢,会提供一个基本的 http server 实现(使用 libevent )。在这篇文章里,我们实现一个通用的数据结构:单链表。 这里实现的单链表,可以存储任意数据类型,支持增、删、改、查找、插入等基本操作。(本文提供的是完整代码,可能有些长。) ...转载 2018-09-12 18:33:37 · 156 阅读 · 0 评论 -
C语言面向对象编程(四):面向接口编程
Java 中有 interface 关键字,C++ 中有抽象类或纯虚类可以与 interface 比拟,C 语言中也可以实现类似的特性。 在面试 Java 程序员时我经常问的一个问题是:接口和抽象类有什么区别。 很多编程书籍也经常说要面向接口编程,我的理解是,接口强制派生类必须实现基类(接口)定义的契约,而抽象类则允许实现继承从而导致派生类可以不实现(重写)基类(接口)定义的契...转载 2018-09-12 18:33:06 · 430 阅读 · 0 评论 -
C语言面向对象编程(三):虚函数与多态
在《 C++ 编程思想》一书中对虚函数的实现机制有详细的描述,一般的编译器通过虚函数表,在编译时插入一段隐藏的代码,保存类型信息和虚函数地址,而在调用时,这段隐藏的代码可以找到和实际对象一致的虚函数实现。 我们在这里提供一个 C 中的实现,模仿 VTABLE 这种机制,但一切都需要我们自己在代码中装配。 之前在网上看到一篇描述 C 语言实现虚函数和多态的文章,谈到在基类中保存派...转载 2018-09-12 18:32:29 · 183 阅读 · 0 评论 -
C语言面向对象编程(二):继承详解
在 C 语言面向对象编程(一)里说到继承,这里再详细说一下。 C++ 中的继承,从派生类与基类的关系来看(出于对比 C 与 C++,只说公有继承): 派生类内部可以直接使用基类的 public 、protected 成员(包括变量和函数) 使用派生类的对象,可以像访问派生类自己的成员一样访问基类的成员 对于被派生类覆盖的基类的非虚函数,在派生类中可以通过基类名和域作用符(:...转载 2018-09-12 18:31:40 · 878 阅读 · 0 评论 -
C89 和 C99 标准比较
注1: GCC支持C99, 通过 --std=c99 命令行参数开启,如:代码:gcc --std=c99 test.c 注2:FFMPEG使用的是C99。而VC支持的是C89(不支持C99)。因此VC一般情况下是无法编译FFMPEG的源代码的。--------------------------------------------------------------------...转载 2018-09-11 11:14:09 · 176 阅读 · 0 评论 -
老司机找bug的十年心路历程
一.码畜:靠编译器帮自己查语法错误消灭笔误:编写适合程序员的键盘练习if (常量==变量或表达式)使用goto接力超长的if,switch连续的if还是if elseif多个条件的组合:精心的排版多重括号的匹配条件编译各种const:不要纠结各种常量了,这个世界上唯一不变的就是变化。用APIWriteProcessMemory还能修改正运行的其它进程的内存里面的所谓...转载 2018-09-11 16:53:38 · 261 阅读 · 0 评论 -
如何利用循环代替递归以防止栈溢出(译)
摘要:我们经常会用到递归函数,但是如果递归深度太大时,往往导致栈溢出。而递归深度往往不太容易把握,所以比较安全一点的做法就是:用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程,相当精彩。本文翻译了这篇文章,并加了自己的一点注释和理解。 目录 简介 模拟函数的目的 递归和模拟函数的优缺点 用栈和循环代替递归的10个步骤 替代过程的几个简单例子 更多的例子 结论...转载 2018-09-11 17:01:37 · 1862 阅读 · 0 评论 -
汉诺塔递归的c语言实现(递归)
对于递归来讲, 汉诺塔实际是经典到不能再经典的例子了, 每个数据结构的教材对会提到. 但是到最后只给出一段类似下面的一段代码: #include<stdio.h> void move(int n,char a,char b,char c) { if(n==1) printf("\t%c->%c\n...转载 2018-09-11 18:21:43 · 4625 阅读 · 1 评论 -
栈溢出示例
一、提出问题 还是先看一段代码:#include <stdio.h>#include <stdlib.h>//Have we invoked this function? void why_here(void){ printf("why u r here?!\n"); exit(0);}int main(int ...转载 2018-09-11 19:18:34 · 374 阅读 · 0 评论 -
Git 的 4 个阶段的撤销更改
源自:Git 的 4 个阶段的撤销更改参考: 廖雪峰git教程git的基本概念图: 1. 基本概念:3个步骤 正常情况下,我们的工作流就是3个步骤,对应上图中的3个箭头线:git add .git commit -m "comment"git push1 2 3 41. git add .把所有文件放入暂存区;2. git commit把所有文件从暂存...转载 2018-09-12 14:47:26 · 169 阅读 · 0 评论 -
C语言实现面向对象的思想
用C语言实现面向对象的方法,面向对象的三个基本特征,对象唯一性,继承性,抽象性。使用C语言中的结构体和函数指针将数据与操作放在一起,使得一个问题的解决方法封装在结构体中。其中结构体的嵌套使用实现了继承性。 #include<stdio.h>#include<stdlib.h> struct Adt2 { int x; int y...转载 2018-09-12 18:26:21 · 221 阅读 · 0 评论 -
C语言面向对象编程(一):封装与继承
最近在用 C 做项目,之前用惯了 C++ ,转回头来用C 还真有点不适应。 C++ 语言中自带面向对象支持,如封装、继承、多态等面向对象的基本特征。 C 原本是面向过程的语言,自身没有内建这些特性,但我们还是可以利用 C 语言本身已有的特性来实现面向对象的一些基本特征。接下来我们就一一来细说封装、继承、多态、纯虚类等面向对象特性在 C 语言中如何实现,并且给出实例。 这篇文章中我们先说封...转载 2018-09-12 18:30:36 · 216 阅读 · 0 评论 -
内存区域的划分和分配
1.内存分配方式 内存分配方式有三种: [1]从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 [2]在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 [3]从堆上分配,亦称动态...转载 2018-09-13 12:29:16 · 578 阅读 · 0 评论 -
深入理解C语言的函数调用过程
深入理解C语言的函数调用过程 本文主要从进程栈空间的层面复习一下C语言中函数调用的具体过程,以加深对一些基础知识的理解。 先看一个最简单的程序: 点击(此处)折叠或打开 /*test.c*/ #include <stdio.h> int foo1(int m,int n,int p) { int x = m + n...转载 2018-09-13 12:32:10 · 396 阅读 · 0 评论 -
c++中的左移、右移运算
移位运算包含“逻辑移位”(logical shift)和“算术移位”(arithmetic shift)。逻辑移位:移出去的位丢弃,空缺位(vacant bit)用 0 填充。算术移位:移出去的位丢弃,空缺位(vacant bit)用“符号位”来填充,所以一般用在右移运算中。 c++中,整数分有符号数和无符号数两种,对于这两种数做左移、右移运算,稍有区别:1、如果是无符...转载 2019-09-20 11:08:17 · 691 阅读 · 0 评论 -
ubuntu下txt文件编码转换、查询(gbk/ISO-8859->utf-8)
在ubuntu下运行python程序,总是报错,说编码不对不是utf-8(貌似是因为汉字部分出问题了),搜集资料后完成了转换。1.文件编码查询$ file 199801.txt199801.txt: ISO-8859 text, with very long lines, with CRLF, LF line terminators2.完成转换$ sudo iconv -f ...转载 2019-08-01 18:45:46 · 1009 阅读 · 0 评论 -
C语言注释规范
2-1:一般情况下,源程序有效注释量必须在20%以上。说明:注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。2-2:文件头部应进行注释,注释必须列出:版权说明、版本号、生成日期、作者、内容、功能、修改日志等。示例:下面这段头文件的头注释比较标准,当然,并不局限于此格式,但上述...转载 2019-01-21 16:52:52 · 5538 阅读 · 0 评论 -
gcc "undefined reference to" 问题解决方法(使用库)
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误:(.text+0x13): undefined reference to `func' 关于undefined reference这样的问题,大家其实...转载 2018-12-12 11:54:33 · 1105 阅读 · 0 评论 -
Linux环境下静态库的生成和使用 (.a文件)
这一阵子的工作用到了linux,也用到了linux的静态库和动态库。正好对这一块儿一直不明白,趁此机会学习了一下。以下是笔记。先说一说linux下静态库的生成和使用方法。 An archive (or st...转载 2018-12-07 10:51:09 · 323 阅读 · 0 评论 -
C语言的int, float,double相互转化 (从本质上理解可能的问题)
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/github_33873969/article/details/78040129 从学了C语言之后,一直习惯于C/C++任意的强制转化,但是C语言的强制转化却总是带来意...转载 2018-12-04 15:55:11 · 5714 阅读 · 1 评论 -
memcmp的性能分析
最近在优化软件运行速度,翻查C++代码的时候,发现了这么一处函数。功能很简单,就是比较内存值是否相同。函数如下:int cfunc_memcmp(char* src, char* dest, int n){ while (n--) if (*src++ != *dest++) ...转载 2018-11-08 15:45:56 · 1463 阅读 · 0 评论 -
memcpy实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/x30465947/article/details/80493069 void *memcpy(void *dest, const void *src, int cou...转载 2018-11-08 11:00:15 · 1277 阅读 · 0 评论 -
memcpy实现
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/x30465947/article/details/80493069void *memcpy(void *dest, const void *src, int count){ void *ptr = dest; if (NULL == dest || NULL == ...转载 2018-11-08 10:49:08 · 559 阅读 · 0 评论 -
内存的静态分配和动态分配的区别【转】
来源: <http://blog.youkuaiyun.com/liuchao1986105/article/details/6724392>内存的静态分配和动态分配的区别主要是两个: 一是时间不同。静态分配发生在程序编译和连接的时候。动态分配则发生在程序调入和执行的时候。 二是空间不同。堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态...转载 2018-10-07 14:36:51 · 996 阅读 · 0 评论 -
深入理解C语言变量和内存——整理篇
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/wangjun_huster/article/details/694869561、基本数据类型变量名和内存的关系: int i; scanf_s("%d", &i);1 2int i;,在这一句就为i分配了内存(但尚未对这块内存进行初始化),所以可以通过&i直接...转载 2018-10-07 14:15:11 · 966 阅读 · 0 评论 -
C语言中为什么要使用enum
版权声明:本文为博主原创文章,转载请注明出处,查看原文章,请访问:http://blog.youkuaiyun.com/xingjiarong https://blog.youkuaiyun.com/xingjiarong/article/details/47275971转载请注明出处,否则将追究法律责任http://blog.youkuaiyun.com/xingjiarong/article/details/47275971...转载 2018-10-12 11:10:04 · 1392 阅读 · 0 评论 -
Linux基础 30分钟GDB调试快速突破
引言 Linus心灵鸡汤 在*nix开发中有道卡叫gdb调试,不管你怎么搞. 它依然在那丝毫不会松动.今天致敬一个 活着的传奇 Linus Torvalds Unix 始于上个世纪60年代,在70年代得到了迅猛的发展,这时候的李纳斯还躺在祖父公寓的摇篮里睡大觉,如果不是后来 Unix 王国自乱阵脚,出现阵营分裂和法律纠纷,可能 Linux 系统根本都不会出现。真实的情况是...转载 2018-09-14 12:06:45 · 972 阅读 · 0 评论 -
gdb调试常用命令
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.youkuaiyun.com/tzshlyt/article/details/53668885gcc -g main.c //在目标文件加入源代码的信息gdb a.out (gdb) start //开始调试(gd...转载 2018-09-14 11:45:57 · 264 阅读 · 0 评论 -
linux c/c++ GDB教程详解
网上一篇非常有用的文章,值得在LINUX下C++开发人员一观! 学习使用了GDB一段时间后,发现它真的好强大!好用!GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的功能。所谓“寸有所长,尺有所短”就是这个道理...转载 2018-09-14 10:15:46 · 225 阅读 · 0 评论