![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C 语言中的迷失
风去沙来
这个作者很懒,什么都没留下…
展开
-
printf如何打印指定长度-防止非NUL结尾的字符串造成的读越界漏洞的方法
CVE-2021-3712 缓冲区读越界漏洞 printf打印指定长度原创 2022-11-11 21:14:34 · 1966 阅读 · 0 评论 -
按某类型对齐的C代码实现
#define ALIGN_UP(addr, align) ((((nlm_uintptr_t) (addr)) + ((align) - 1)) & ~((align) - 1))test programing:#include #include int main(){ int i = 0, n = 0; printf("---原创 2013-11-01 16:29:42 · 1288 阅读 · 0 评论 -
请用C语言在32位环境下,两个无符号长整数相加的函数,相加之和不能存储在64位变量中
#include #include void add64(unsigned int add1,unsigned int add2,unsigned int *pSumHigh,unsigned int *pSumLow){ *pSumLow = add1 + add2; if(*pSumLow { *pSumHigh = 1; } else转载 2013-09-29 23:31:32 · 3313 阅读 · 0 评论 -
结构体的大小的计算与空间的优化--之基本类型
结构体对齐 对齐 结构体大小 结构体大小如何最小 结构体大小如何优化 结构体空间的优化原创 2013-09-20 19:17:51 · 3215 阅读 · 0 评论 -
结构体的大小的计算与空间的优化--之位域字段
位域 位域结构体 对齐 结构体对齐 结构体长度 位域结构体空间的优化原创 2013-09-21 00:30:34 · 4346 阅读 · 2 评论 -
自加(++)操作符在变量前后的问题测试
自加操作符 自减操作符 ++ --原创 2013-09-19 02:53:29 · 1563 阅读 · 0 评论 -
关于一些代码中定义为空的宏的作用
/********************************************************************* * Author : Samson * Date : 05/03/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-05-03 17:17:18 · 7986 阅读 · 0 评论 -
关于core文件
/********************************************************************* * Author : Samson * Date : 04/18/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-04-17 18:42:14 · 5806 阅读 · 0 评论 -
不可重入函数的产生和预防
/********************************************************************* * Author : Samson * Date : 04/25/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-04-25 05:56:01 · 1371 阅读 · 0 评论 -
C语言字符串复制的实现
/********************************************************************* * Author : Samson * Date : 01/09/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-01-09 21:24:24 · 3666 阅读 · 0 评论 -
有符号及无符号位域值的测试
/********************************************************************* * Author : Samson * Date : 04/02/2014 * Test platform: * Linux ubuntu 3.2.0-58-generic-pae *原创 2014-04-02 20:47:44 · 2345 阅读 · 0 评论 -
GDB详解
目录(?)[-]简介生成调试信息启动GDB 的方法程序运行上下文程序运行参数工作目录程序的输入输出设置断点简单断点多文件设置断点查询所有断点观察点条件断点维护停止点为停止点设定运行命令调试代码查看运行时数据程序变量自动显示历史记录改变程序的执行修改变量值跳转执行产生信号量强制函数返回强制调用函数显示源代码调试已运行的进程线程查看栈信息信号catc转载 2014-03-22 03:16:49 · 898 阅读 · 0 评论 -
编译C语言单元测试框架CUnit库的方法
下载 CUnit-2.1-3.tar.bz2:http://sourceforge.net/projects/cunit/解压:tar jxvf CUnit-2.1-3.tar.bz2cd CUnit-2.1-3因为是使用GNU automake的aclocalautoheader autoconf automakeautomake --add原创 2015-06-04 10:58:15 · 2570 阅读 · 0 评论 -
可以返回执行结果的system函数加强版本
在GNU Linux C编程中,要想进行系统命令的执行的话,只提供了system接口,但是此接口并不能得到命令执行后所输出的值,而只能够得到命令是否执行成功的结果。仅仅这样的功能还是不够的,有的时候是要必须通过命令的输出来判断下一步的结果或步骤的,那么怎么样能够得到system命令执行的结果呢?那就可以使用到popen函数和fgets函数进行命令的输出信息的获取了,实际例子如下:注意:此接口只原创 2015-03-13 21:15:59 · 1913 阅读 · 0 评论 -
读取到配置文件的C语言的接口实现
为了完成读取系统中的配置文件的某个key键的值,由于使用别人的库总是不爽,而且对于格式有一定的要求,那么就自己来写一个这样的接口以供使用了。实现原理很简单,通过打开配置文件,进行一行一行的读取,对比行中是否存在key串且此key串的下一个字符是否为'=',若是,则得到'='号之后的值。注意:此实现方法只适用于key=value这样的配置格式,而不是很多配置文件的key="value"的格式。原创 2015-03-13 21:13:03 · 1871 阅读 · 0 评论 -
C语言如何清空一个文件的例子
如何使用C语言使一个文件的内容直接就清空了呢?答案就在如下的程序代码中:#include #include #include #include #include #define PATHNAME "./test"int main(){ int ret = open(PATHNAME, O_WRONLY | O_TRUNC);原创 2015-02-12 17:14:04 · 13377 阅读 · 0 评论 -
ASLR(Address space layout randomization)地址空间布局随机化
ASLR:Address space layout randomization:地址空间布局随机化,是参与保护缓冲区溢出问题的一个计算机安全技术。是为了防止攻击者在内存中能够可靠地对跳转到特定利用函数。ASLR包括随机排列程序的关键数据区域的位置,包括可执行的部分、堆、栈及共享库的位置。历史:在1997年,Memco软件公司实现了一个有限的堆栈随机化作为SeOS访问控制产品的一部翻译 2014-12-07 23:51:26 · 10109 阅读 · 0 评论 -
gdb如何调试没有符号表(未加-g选项的编译)的程序
很多时候,发行版的程序在编译的时候都是没有加上-g这个选项的,那么若是想调试一个程序,应该怎么办呢?在加了-g选项时,是可以通过行号、函数名等进行断点的设置的,但是没有符号表的情况下,那么怎么来进行程序的断点的设置并进行调试呢?这就要用到反汇编然后再对地址进行断点的设置来进行调试,具体情况可参看以下例子的过程:test.c代码如下:#include #i原创 2015-01-30 22:41:49 · 20475 阅读 · 6 评论 -
NOP指令概述及作用
计算机科学中,NOP或NOOP(No Operation或No Operation Performed的缩写,意为无操作)是汇编语言的一个指令,一系列编程语句,或网络传输协议中的表示不做任何有效操作的命令。NOP是用执行一条具有操作数,具有相同效果的指令;NOP指令通常用于控制时序的目的,强制内存对齐,防止流水线灾难,占据分支指令延迟),或是作为占位符以供程序的改善(或替代被移除的指令)。原创 2014-08-03 02:26:48 · 16652 阅读 · 0 评论 -
gcc: dereferencing pointer to incomplete type错误
dereferencing pointer to incomplete type是什么错误?原创 2014-07-27 19:35:08 · 39522 阅读 · 1 评论 -
内存拷贝程序的优化--利用系统的特性
/********************************************************************* * Author : Samson * Date : 07/04/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-07-04 05:05:58 · 1961 阅读 · 2 评论 -
C语言字符串查找的几种实现
/********************************************************************* * Author : Samson * Date : 01/09/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-01-09 22:04:00 · 4667 阅读 · 0 评论 -
C语言字符串连接的实现
/********************************************************************* * Author : Samson * Date : 01/09/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-01-09 21:25:54 · 1772 阅读 · 0 评论 -
define 定义的存在周期
#define x 3 //定义宏x为3#define y x*2 //定义宏y为x*2#undef x //取消对宏x的定义#define x 2 //重新定义宏x为2 int z = y;z为4 宏的生命期只在#define和undef间原创 2009-08-07 16:10:00 · 923 阅读 · 0 评论 -
Const变量与define之存储
const 定义的只读变量从汇编角度来看 只是给出了对应的内存地址 而不是像define一样给出的是立即数 所以 const定义的只读变量在程序运行过程中只有一份拷贝(因为它是全局的只读变量 存放在静态区) 而define定义的宏变量在内存中有若干个拷贝 define宏是在预编译阶段进行替换 而const修饰的只读变量是在编译的时候确定其值 define宏没有类型 而const修饰的只读变量具有特原创 2009-08-07 16:03:00 · 1967 阅读 · 0 评论 -
C自增(++)自减(--)运算之贪心法则
c语言有这样的一个规则:每一个符号应该包含尽可能多的字符.也就是说,编译器将程序分解成符号的方法是:从左到右一个一个字符地读入,如果此字符可能组成一个符号,那么再读入下一个字符,判断已经读入的两上字符组成的字符组成的字符串是否可能是一个符号的组成部分,如果可能,继续读入下一个字符,重复上述判断,直到读入的字符组成的字符串已不再可能组成一个有意义的符号.这个处理的策略被称为"贪心法".如:int原创 2009-08-07 15:57:00 · 1359 阅读 · 0 评论 -
左右移位操作的规则
0x01 0x01 以上这样行吗?? 不行. 一个整数长度为32位,左移32位 会溢出 左移-1位??? 左移和右移的位数不能大于数据的长度,不能小于0.原创 2009-08-07 15:54:00 · 1580 阅读 · 0 评论 -
#define和typedef比较
#define INT32 int unsigned INT32 i = 10; //正确 typedef int int32;unsigned int32 j = 10; //出错 为啥子喃 ??? 因为在预编译的时候INT32被替换为int 而unsigned int i = 10;语句是正确的 但是 用typedef取的别名不支持这种类型扩展. d原创 2009-08-07 15:39:00 · 1339 阅读 · 0 评论 -
数组经典
int a[5];当我们定义上面这么一个数组时,编译器根据指定的元素个数和元素的类型分配确定大小(元素类型大小*元素个数)的一块内存,并把这块内存的名字命名为a.a[0],a[1]等为a的元素,并非元素的名字.数组的每一个元素都是没有名字的.sizeof(a) 的值为sizeof(int ) *5 sizeof(a[0]) 为sizeof(int)sizeof(a[5]) 为4原创 2009-08-07 16:21:00 · 629 阅读 · 0 评论 -
可不可以用宏定义定义注释标记呢???
如例子: #define BSC // #define BMC /* #define EMC */ BSC my single-line comment BMC my multi-line comment EMC //通过以上二句我们想要得到的结果是://my single-line comment /*my multi-line comme原创 2009-08-07 16:06:00 · 2077 阅读 · 1 评论 -
何为柔性数组
c99中 结构中的最后一个元素允许是未知大小的数组 这就叫做柔性数组成员。但结构中的柔性数组前面必须至少一个其他 成员,柔性数组成员允许结构中包含一个大小可变的数组.sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小 以适应柔性数组的预期大小. 柔性数组到底如何使用:例子: typed原创 2009-08-07 15:37:00 · 118 阅读 · 0 评论 -
##的用法
和#一样 此运算符可以用于宏函数的替换部分.这个运算符把两个语言符号组合成单个语言符号.例如: #define MAN(woman) Man##woman 使用: MAN(Super) 展开就是:ManSuper原创 2009-08-07 16:18:00 · 23671 阅读 · 0 评论 -
#pragma的用法
在所有的预处理指令中 #pragma指令可能是最复杂的了 它的作用是设定编译器的状态或是指示编译器完成一些特定的动作.此指令对每个编译器给出了一个方法 在保持C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征.#pragma message("消息文本")当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来.当我们在程序中定义了许多宏来控制源代码版本的时候 我们自己有可能会忘记原创 2009-08-07 16:13:00 · 986 阅读 · 0 评论 -
# 其实也是个预处理
#也是预处理??是的 #define SQR(X) printf("the square of x is %d/n",((x)*(x)));如果这样用此宏:SQR(8); 则输出为: the square of x is 64引号中的x被当作普通文本来处理 而不是当作一个可以被替换的语言符号.假如你确定想在字符串包含宏参数,那我们就可以使用"#",它可以把语言符号转化为字符串,改上面的原创 2009-08-07 16:15:00 · 623 阅读 · 0 评论 -
为什么要对齐及利弊
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开始存取。其他平台可能没有这种情况,但是最常原创 2009-09-07 14:27:00 · 899 阅读 · 0 评论 -
C语言字符串比较的实现及求字符串长度的实现
/********************************************************************* * Author : Samson * Date : 01/09/2012 * Test platform: * GNU Linux version 2.6.29.4 * g原创 2012-01-09 21:27:32 · 4178 阅读 · 0 评论 -
系统支持的是否大小端的测试程序
#include typedef union testunion{ short a; char b[2]; }uniontest;intmain(){ uniontest aa; aa.a = 0x0102 printf("aa.a is 0x%x aa.b[0] is 0x%x aa.b[1] is 0原创 2011-10-10 23:59:27 · 798 阅读 · 0 评论 -
怎么查看动态分配内存空间的大小(GNU linux下C语言版)
若需转载 请注明出处RT,经过几番纠结,终于找到了GNU like UNIX平台下得到malloc后的大小的方法,microsoft有_msize可完成类似功能,现将测试代码甩上来,以咨参考/******************************************************************** * Function: Tes原创 2011-11-23 23:02:55 · 3978 阅读 · 0 评论 -
##号的用途及linux c测试代码
大家都知道##这两个的意思是什么吧?可见:http://blog.csdn.net/yygydjkthh/article/details/4422945 其实就是连接的作用,例如:a##1 的结果就是a1,这是简单的用法了,若只是如此的话并莫有什么意义的,但也不要小瞧它哟 在很多实际运用中还是有大用处的,如宏定义一个打印方法:/*********************原创 2011-11-23 23:40:36 · 1712 阅读 · 0 评论 -
C语言位域操作测试程序
#include typedef struct weiyutest{ unsigned a:3; unsigned b:5; unsigned c:8; unsigned d:9;}test;intmain(原创 2011-10-11 00:08:28 · 986 阅读 · 0 评论