C/C++
文章平均质量分 55
奔跑的码仔
心有多大,舞台就有多大
展开
-
C语言基础|你真的了解snprintf吗?
作为一名C语言开发者,肯定用过snprintf函数,但是,你真的了解snprintf吗?原创 2022-06-13 22:17:59 · 3089 阅读 · 1 评论 -
面向C语言编程|数据类型“多态”
多态是面向对象编程中的一个概念,表示一个对象,比如一个接口,在不同的情况下,有不同的表现形式。比如,对于人这个对象,其都会有吃饭,这个接口。但是对于不同的”人,其吃饭所用的工具可能不尽相同,比如,中国人通常用筷子吃,外国人通常用的是刀叉,当然,对于中国小孩,也可能用的是勺子,😃 。C语言中基本数据类型,含义十分的明确,32bit系统来说,char就是一个字节,short就是两个字节,int和long也有类似的定义。那么,如何用C语言实现,同一个数据类型表达多个含义呢?我们其实可以使用union来实现,一定原创 2022-05-26 22:26:29 · 370 阅读 · 0 评论 -
记一次C栈溢出
今天与大家分享的一次堆栈溢出的调试过程,废话少说直接看代码。1 #include <stdio.h>2 #include <string.h>3 void stack_damage(char *buffer, int *len)4 {5 char *str = "stack damaged!";6 int slen = strlen(str);7 strncpy(buffer, str, slen);8 *len = slen;9 }1原创 2021-05-31 23:01:49 · 268 阅读 · 0 评论 -
史上最小的Http服务器
概述TinyHttp基于CSAPP(深入理解计算机系统第11章网络编成)实现。TinyHttp足够小,只有不到300行的代码,却可以完整的展示一个Web服务器的基本原理和功能。TinyHttp实现了HTTP的GET、POST、HEAD方法处理过程。TinyHttp可以动态的扩展静态文件类型。TinyHttp可以动态的扩展cgi-bin下的可执行程序,完成各种不同功能的动态内容的生成。TinyHttp是健壮的,实现对于常见异常的处理过程,比如,SIGPIPE信号等。项目代码:https://原创 2021-01-28 19:07:25 · 1851 阅读 · 1 评论 -
EOF到底是什么意思?
概述我们在使用C标准I/O时,经常会看到EOF这个概念。起初,我认为EOF就是字面意思即,到达了文件的结尾(End of File)。可是,最近在看K&R时,发现函数返回时EOF表示的是当前函数调用出现了错误,这些错误包括:文件达到了末尾;文件读写出现了错误,比如,磁盘没有空间。下面是man中,关于fgetc的解释:fgetc() reads the next character from stream and returns it as an unsigned char cast t原创 2021-01-25 19:29:25 · 26682 阅读 · 1 评论 -
你真的懂C的格式化I/O吗?(下)
系列文章目录[C语言]之基本输入输出(格式化I/O)文章目录系列文章目录回顾格式化输入回顾上一篇文章主要是总结了C语言下格式化输出相关的内容,这一节来总结一些格式化输入相关的内容。格式化输入下面是ANSI C定义的标准的输入函数族:#include <stdio.h>int scanf(const char *format, ...);int sscanf(const char *string, char *format, ...);int fscanf(FILE *str原创 2021-01-24 12:29:59 · 317 阅读 · 0 评论 -
你真的懂C的格式化I/O吗?(上)
前言说起C语言I/O操作,学过C的人第一反应想到的肯定是printf/scanf之类的函数,那可是C语言的基础,程序调试的必备技能 ????。不错,作为一名C程序猿,printf确实是使用最为高频的函数了。但是如果我要问,如何格式化输入/输出我们想要的内容,大家可能就有点心虚了。为了修补上这个bug,今天我就和大家一起学习一下C的格式化I/O。格式化输出下面是ANSI C定义的标准的输出函数族:#include <stdio.h>printf(char *format, ...);原创 2021-01-23 13:25:24 · 517 阅读 · 0 评论 -
strcpy()和strncpy使用
关于strcpy()的使用可能有的时候存在一些误解,在linux下使用man手册得到该函数的形式为:char *strcpy(char *dest, const char *src);当调用了函数以后,dest指针指向字符串dest的首地址,并且这个地址作为返回值返回给调用者。该函数的简单实现如下: char * strcpy(char *dest, c原创 2012-08-26 13:57:18 · 837 阅读 · 0 评论 -
Linux 下定时器的实现方式分析
文章出处:http://www.ibm.com/developerworks/cn/linux/l-cn-timers/#icomments定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持,但使用场景的不同,对定时器的实现考虑也不尽相同,本文讨论了在 Linux 环境下,应用层和内核层的定时器的各种实现方法,并分析了各转载 2014-12-14 14:54:02 · 1933 阅读 · 0 评论 -
简论C-数组和指针
指针和数组1.指针和数组定义、区别 1.1指针和数组定义指针和数组都是C语言的精髓所在,对于很多C程序员来说,如果你问这样一个问题:数组和指针有什么区别?他们的答案很可能是:”数组和指针不是同一样东西吗,他们之间有什么区别啊?“;确实在极个别的情况下,数组和指针确实可以”通用“,但是在却大多数情况下,数组和指针是两个完全不同的C语言特性;首先,我们分别看一下,指针和数组的定义,原创 2015-12-21 21:46:20 · 826 阅读 · 0 评论 -
原码, 反码, 补码 详解
一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。那么,这里的 00000011 和转载 2014-10-26 11:32:48 · 772 阅读 · 0 评论 -
C语言字符串使用注意事项
C语言字符串使用注意事项原创 2014-09-30 14:25:03 · 3097 阅读 · 0 评论 -
64位平台C/C++开发注意事项
在http://www.viva64.com/en/l/上例出了28个在64位平台上使用C/C++开发的注意事项,对于进入64位时代的程序员应该去看看这28个事项,这些英文读物对于有C/C++功底的朋友读起来应该并不难,我估计大约20-30分钟可以精读完一篇(或者更快),下面是这28个注意事项的列表。相信对大家一点有帮助。Lesson 01. What 64-bit systems are转载 2014-09-29 14:15:00 · 1027 阅读 · 0 评论 -
启用Sqlite3 的Unlock Notification
今天编译基于sqlite的数据库提示:对‘sqlite3_unlock_notify’未定义的引用错误。解决方案如在: 为了使用Sqlite提供的 Unlock Notification机制,我们需要在编译生成sqlite库添加SQLITE_ENABLE_UNLOCK_NOTIFY选项。sqlite-autoconf-3080600$ CFLAGS="-DSQLITE_ENA原创 2014-09-24 10:48:19 · 2717 阅读 · 0 评论 -
BCD与ASCII码互转-C语言实现
BCD与ASCII码互转-C语言实现原创 2014-09-23 11:52:34 · 20778 阅读 · 4 评论 -
内存池机制实现解析-Nginx
Nginx源码剖析之内存池,与内存管理作者:July、dreamice、阿波、yixiao。出处:http://blog.csdn.net/v_JULY_v/。引言 Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议转载 2014-03-24 22:26:26 · 1245 阅读 · 1 评论 -
Android C/C++开发指南
AndroidC/C++开发指南1.AndroidC/C++简介众所周知,Android作为目前主流的移动终端领域的开发平台,其主要的开发语言就是JAVA。Android借助于JAVA高效、灵活的开发模式,迅速占领了移动互联网开发的半壁江山。基于JDK和Android实现的各种JAVA框架,开发人员可以快速实现各种功能的APP,而且APP的安装和升级维护都实现的方便。对于,Andr原创 2016-11-06 18:07:32 · 14027 阅读 · 2 评论 -
TCP/IP checksum 简析
标题 ##TCP/IP checksum 简析标题 ##Checksum原理Checksum广泛应用于TCP/IP协议族,用于校验IP、TCP、UDP数据,其原理比较简单,其计算校验和的步骤如下: 1)在数据发送端,首先将检验和字段本身清零,将被检验的相邻字节成对配成16bit的整数,将所有的配对相加,同时将进位加到校验和的低字节上,我们将得到的校验和定义为a,最后再将校验和取反记为-a,将-a放原创 2016-12-10 18:44:13 · 6624 阅读 · 0 评论 -
一个问题引出的---对gcc与C语言标准思考
最近在总结关于Linux系统关于Time处理相关的API,当在开发库中使用到localtime_r以及clock_gettime时,会提示如下的错误(-Werror选项打开):error: implicit declaration of function ‘localtime_r’ [-Werror=implicit-function-declaration]解决步骤怀疑GCC版本开发库...原创 2019-01-11 10:43:46 · 3732 阅读 · 2 评论 -
Glibc version `GLIBC_2.17‘ not found问题解决办法
Glibc version `GLIBC_2.17’ not found问题解决办法今天在ARM板上测试一个串口性能测试工具linux-serial-test时,提示 “version `GLIBC_2.17’ not found”,这个问题还是第一次见,简单查了一下资料,基本确定是应用程序所依赖的glibc环境在目标平台上不支持。可是,之前使用同一交叉编译器编译出来的程序一直没问题。看了一下...原创 2018-08-31 16:03:56 · 13101 阅读 · 0 评论 -
Linux 串口编程(基于RAW模式)
Linux下的串口编程对于大多数的系统编程人员来说肯定不陌生,特别是对于嵌入式系统开发人员来说,其会经常使用串口与各种各样的硬件设备进行通信。下面总结一下,Linux串口编程的基本模式和常见问题。编程模式Linux下的串口以设备文件的形式存在,所以,对于串口设备的所有操作都时围绕其设备文件而展开。熟悉Linux文件相关操作的开发人员,应该很熟悉下面的模式:打开文件(open);...原创 2018-08-31 11:38:50 · 5726 阅读 · 1 评论 -
GNU/Linux C 库I/O缓冲机制
0.引子对于使用C语言开发者着而言,I/O库可能是最为经常的使用的程序库,当你需要调试的时候可能最为经常使用的就是printf打印了。可是不知道大家,是不是遇到过这样一个问题,那就是我明明打印了,为什么终端里没有输出呢?为什么日志没有存到文件里?我也遇到过这样的问题,当时也没有搞清楚问题的原因。今天,在读UNIX高级环境编程的fork一节时,意外的收获了对于该问题最终的解释,一切的原因都是因为...原创 2018-03-17 17:26:13 · 632 阅读 · 0 评论 -
valgrind manual
valgrind manual基本介绍Valgrind工具套件提供了一整套的调试和配置工具,其能帮助使你的程序可以运行更快以及更正确.Memcheck是该套件中最为著名一个.它能探测到很多导致C/C++应用程序崩溃和不能定位的crash的内存相关的问题.基本运行命令valgrind –tool=memcheck –leak-check=yes –log-file= log.file prog原创 2017-09-20 11:30:42 · 691 阅读 · 0 评论 -
Android系统调试-程序崩溃调试
Android系统调试-Native 调试Android系统对于Native(C/C++)应用程序的调试手段比单纯的linux系统更为丰富.一般我们调试linux系统的应用程序崩溃问题,都是通过coredump文件与gdb结合调试的手段.但是Android系统的天然不支持这种调试方式,其在内核中就没有启用coredump生成机制,那么Android系统下我们使用什么方式调试Native程序的崩溃问题原创 2017-09-01 14:50:51 · 4176 阅读 · 0 评论 -
android平台移植valgrind
Android平台移植Valgrind开发平台信息PC: Ubuntu16.04Android:Firefly Rk3288 Reload + Android 5.1交叉编译器:arm-linux-androideabi-gcc 4.6 衍生自android-ndk-r10b(开发工具的生成方式可以参见Android C/C++开发指南)valgrind版本valgrind-3.13.0配原创 2017-09-18 17:11:20 · 1518 阅读 · 0 评论 -
gcc-stack-protector机制
GCC “stack smashing detected”机制相信使用C/C++语言开发软件的程序猿们都经历过‘栈溢出’的问题。‘栈溢出’问题通常十分的隐蔽,有的时候问题复现也十分的困难。每当软件出现莫名其妙的问题时,总是有人怀疑是不是栈溢出了,但是问题的排查又十分的困难,所以,‘栈溢出’就是广大C/C++开发者的噩梦。大家不禁要问有没有通用的方法来避免或者来检测’栈溢出‘问题呢?其实,’栈溢出‘问原创 2017-04-16 09:56:30 · 19390 阅读 · 2 评论 -
关于C 多维数组与指针的问题
#include int main(void){ int apricot[2][3][5]; int array[10]; //int (*p)[] = &array; //int *pa = array; int (*p)[3][5] = apricot; int (*r)[5] = apricot[原创 2014-04-15 21:37:37 · 1367 阅读 · 2 评论 -
阅读优秀代码是提高开发人员修为的一种捷径
文章出处:http://www.kuqin.com/pragmatic/20111208/315844.html编者按:原文作者Alan Skorkin是一名软件开发人员,他在博客中分享对软件开发相关的心得,其中有很多优秀的文章,本文是其中的另一篇。Alan认为:阅读优秀代码是提高开发人员修为的一种捷径。以下是全文。我突然想起来,很多程序员都讨厌阅读代码。来吧,承认吧! 每个人都喜转载 2014-02-23 21:47:47 · 1100 阅读 · 0 评论 -
linux gdb-多线程调试
linux下应用程序的调试工具主要就是gdb,可能你已经习惯了IDE形式的调试工具。也许刚开始使用gdb作为调试工具,会有诸多的不变,但是一旦你学会了如何使用gdb你就会被其富有魔力的功能所吸引的,下面开始逐步的学习linux下gdb的使用方式。一直以来对于gdb在多线程调试方面的应用好奇,最近,由于项目需要,学习了linux下的gdb在多线程下的调试方法。下面就结合一个简单的案例介绍一下gd...原创 2013-05-05 21:18:07 · 14418 阅读 · 3 评论 -
WebRtc 音频引擎-linux demo
Google收购了著名的音频技术公司GIPS后,基于其强大的音频技术,实现了WebRtc的Voice Engine,即语音处理引擎。本文主要介绍WebRTC 中Voice Engine中音频技术相关的实现,并结合具体实例,介绍如何利用voice engine实现自己的VoIP音频处理引擎。本文主要介绍如何在linux下搭建一个可以自己调试的基于WebRTC的voiceEngine。1.Vo原创 2013-06-07 21:45:45 · 5499 阅读 · 3 评论 -
diff C && C++
1.函数声明为空的区别int func_void();对于C而言,上述函数表示func_void函数可以使任意个数、类型。如果要定义没有参数的函数,参数类型需为void类型对于C++而言,func_void()即是表示参数为空的函数。#includeint func(){ printf("liang\n"); return 0;}int m原创 2013-04-27 22:30:52 · 3004 阅读 · 0 评论 -
动、静态库编译顺序
具有依赖关系的动、静态库在编译时,要特别注意链接库的顺序(连接顺序从右到左),例如,程序foo.c 依赖库A、B。动态库、或静态库A依赖于静态库B,在编译连接的时候,顺序如下:gcc -o foo foo.c -lA -lB如果顺序颠倒的话,将会提示A库中找不到B库的关联信息,在编写具有多个具有依赖关系的静态库时,需要特别注意顺序问题!原创 2013-04-27 21:04:41 · 2173 阅读 · 0 评论 -
gdb使用技巧
几则gdb使用技巧转载时请注明出处:http://blog.csdn.net/absurd/gdb的功能强大,与带GUI的调试器相比有过之而无不及,使用也就相对复杂一些。一方面是它的亲和力稍差,毕竟是给程序员用的,不用做得傻瓜化。另外一方面它的命令太多,我们常常浅尝辄止,只记得几个常用的命令就知足了,没有充分发挥它的潜力。今天要调试一段ARM汇编代码,按常规方法调试汇编代码非常麻烦原创 2013-01-11 23:17:02 · 846 阅读 · 0 评论 -
Linux 调试工具
随着XP的流行,人们越来越注重软件的前期设计、后期的实现,以及贯穿于其中的测试工作,经过这个过程出来的自然是高质量的软件。甚至有人声称XP会淘汰调试器!这当然是有一定道理的,然而就目前的现实来看,这还是一种理想。在日常工作中,调试工具还是必不可少的。在Linux下,调试工具并非只有gdb,还有很多其它调试工具,它们都各有所长,侧重方面也有所不同。本文介绍几种笔者常用的调试工具:1.原创 2012-12-29 11:25:57 · 890 阅读 · 0 评论 -
C/C++ enum使用
★版本1 假设一开始只需要处理HTTP和FTP两种协议。有些同学不假思索,立即会声明如下两个整数用于统计:int nCntHttp = 0;int nCntFtp = 0; 猛一看,似乎没啥问题。但是,如果需求发生变更,又要增加两种协议:SMTP和SSH。然后,该同学会继续扩展上述代码,变为如下:int nCntHttp = 0;int nCntFtp =原创 2012-12-27 21:09:15 · 924 阅读 · 0 评论 -
C 扩展关键字 typeof 解析
Another way to refer to the type of an expression is with typeof. The syntax of using of this keyword looks likesizeof, but the construct acts semantically like a type name defined withtypedef.原创 2012-11-07 22:46:07 · 911 阅读 · 0 评论 -
linux 内核中container_of和offsetof宏定义解析
问题:如何通过结构中的某个变量获取结构本身的指针???关于container_of见kernel.h中:/*** container_of - cast a member of a structure out to the containing structure* @ptr: the pointer to the member.* @type: the t原创 2012-11-07 22:17:59 · 1198 阅读 · 0 评论 -
C语言面试题
#include int main(){int a[5]={1,2,3,4,5};int *ptr1=(int *)(&a+1);int *ptr2=(int *)((int)a+1);printf("%x\t,%x\n",ptr1[-1],*ptr2);return 0;}请问,上面的程序在X86环境下输出什么?说明原因原创 2012-09-24 22:29:54 · 1318 阅读 · 1 评论 -
static,inline,volatile
1、static(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容[cpp] view plaincopyprint?char a = 'A';// glob转载 2012-08-27 21:30:40 · 1061 阅读 · 0 评论 -
Ok6410裸板程序开发(1)-开发环境搭建
废话不都说,直接进去正题。本人的开发环境如下:@system:Ubuntu12.04@串口工具:minicom@交叉工具链:arm-linux-gcc4.3.2开发裸板程序时,没有选择Jlink,主要原因就是它不好用,而且还需要另需购买。本人开发依靠的是烧写有uboot的开发板,利用uboot的loady命令将程序直接拷贝到ram中,然后直接执行。虽然,不是完全意义上的裸板开原创 2013-07-07 21:39:40 · 1746 阅读 · 0 评论