随笔分类 - C
摘要:## 前言 ## 在计算机中数据存储和传输以位(bit)为单位,每8个位bit组成1个字节(Byte)。32位计算机的字长为32位,即4个字节;对应的,64位计算机的字长为64位,即8个字节。计算机系统对基本类型数据在内存中存放的位置有限制,要求这些数据的起始地址的值是某个数k的倍数,这就是所谓的内
阅读全文
摘要:函数调用可能引发的问题 1. 传入getMemory(char *p, int num)函数的形参为字符串指针,在函数内部修改形参并不能真正的改变传入形参的值,执行完 后的str仍然为NULL; 毛病出在函数GetMemory 中。 编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是 _p
阅读全文
摘要:话不多说,上代码。 64位系统 #include <stdio.h> #include <stdlib.h> #include <string.h> struct A { short a; char b; char c; char d; }; struct B { char b; short a;
阅读全文
摘要:1、引言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种设计方法、设计思想。 它表现出来的三个最基本的特性就是封装、继承与多态。 很多面向对象的编程语言已经包含这三个特性了,例如 Smalltalk、C++、Java。 但是你也可以用几乎所有的编程语言来实现面向对象编程,例如 ANS
阅读全文
摘要:snprintf(),函数原型为int snprintf(char *str, size_t size, const char *format, ...)。 将可变参数 “…” 按照format的格式格式化为字符串,然后再将其拷贝至str中。 #include <stdio.h> int main
阅读全文
摘要:这段代码其实考察的是变量作用域的知识,最终答案是4,20,仔细分析一下。 有两个知识点需要先说明下: 1.static成员存在作用域的问题,static成员并不是在函数内定义了在函数任何部位都可以访问,而是局限在大括号之间{ },也就是在这段大括号内static成员才有效,出了这个大括号就无法访问。
阅读全文
摘要:为了在程序运行过程中,将两个结构体数组合并成一个大的结构体,在节省空间的基础上,我使用一个大的结构体指针数组,来将其元素分别指向结构体数组中的结构体。 实现过程中,发现这个结构体指针数组的大小是不能确定的,所以使用变长数组来声明,由于gcc编译器未支持C99标准,所以编译无法通过。 进而,我使用ma
阅读全文
摘要:今天使用strlen时 ,发现一个问题,demo代码如下: 运行后,发现结果,有点蹊跷,有时候是0,有时候是6。 strlen在计算数组长度的时候是遇到‘\0’时计算就停止。 如果不在字符数组后面加上‘\0’,那么strlen就会一直计算下去,直到遇到内存中的'\0',才停止计算。 可以看到在内存的
阅读全文
摘要:#define setbit(x,y) x|=(1<<y) //将X的第Y位置1 #define clrbit(x,y) x&=~(1<<y) //将X的第Y位清0
阅读全文
摘要:一、n-1发生了什么 ①、二进制数n,n-1后,如果最后一位是0,将向前一位借2,2-1=1。最后一位为1。如果前一位为0,将继续向前一位借2,加上本身少掉的1.则变为1。一直遇到1。减为0. 所以 二进制 xxxx10000-1 = xxxx01111 ②、n&n-1 按照上述 n=xxxx100
阅读全文
摘要:通常的交换两个变量a,b的过程为 需借助上面的第3个临时变量temp. 采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量: 这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质: 1.任意一个变量X与其自身进行异或运算,
阅读全文
摘要:一、宏定义,实现局部作用域 贴上一段代码: 显然,代码输出 因为define只有替换的作用,所以预处理后,代码实际是这样的: 在宏中加入do...while(0): 相当于: 二、替代goto goto可以解决多个if的时候,涉及到内存释放时忘记释放的问题,但是多个goto,会显得代码冗余,并且不符
阅读全文
摘要:一、什么是正则表达式? 有人说,正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,而正则就是这个模具,定义一种规则去匹配符合规则的字符。 有人说,在编写处理字符串的程序或网页时,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的工具。换句话说,正则表
阅读全文
摘要:目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 另外,在博客看到一个输出结构体的demo,贴在这里 只需要传入要打印结构体的结构体指针和结构体大小,就可以进行打印,且
阅读全文
摘要:输出最小宽度用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0(当最小宽度数值以0开头时)。 X 表示以十六进制形式输出02表示不足两位,前面补0输出;如果超过两位,则实际输出举例: 而如果直接写为 %2x,数据不足两位时,实际输出,
阅读全文
摘要:两种方法1.全部读入内存 修改后重新存入文件2.边读边写到另一新建文件 要修改的部分修改后存入新建文件 其他部分原封不动写入写完删掉原先文件 将这个新的改为删掉那个的名字 方法一 读入内存修改 然后重新写入文件 方法二 逐行写入临时文件,遇到修改部分 修改后写入临时文件 完成后删除data.txt
阅读全文
摘要:之前我们讲到了过程活动记录(AR),那么如何来操纵AR呢,一个可能的方法是,根据局部变量的地址进行推算,例如对于上面的a函数,执行a函数时的当前AR地址就是参数i的地址偏移8个字节,也就是 ((char*)&i) - 8。 然而,不同的C编译器,以及不同的硬件平台都会产生不同的AR结构布局,甚至在一
阅读全文
摘要:C 语言自动提供的服务之一就是跟踪调用链——哪些函数调用了哪些函数,当下一个return语句执行后,控制将返回何处等。解决这个问题的经典机制是堆栈中的活动记录。 当每个函数被调用时,都会产生一个过程记录(或者类似的结构)。过程活动记录是一种数据结构,用于支持过程调用,并记录调用结束以后返回调用点所需
阅读全文