
C语言
文章平均质量分 65
引壶觞以自酌,眄庭柯以怡颜
死磕技术
展开
-
sync fsync fdatasync 三者的区别
UNIX 系统提供了sync、fsync和fdatasync三个函数。原创 2022-12-13 16:47:07 · 768 阅读 · 1 评论 -
#pragma pack (n)使用详解
在缺省情况下,编译器为了让程序跑得跟快,减少CPU读取数据的指令周期,对结构体的存储进行了优化,比如:如下结构体struct s{char ch;int i;};虽然变量ch本身只有1个字节,但实际上却占用掉了4个字节,为的是让第二个int型成员i的地址能够被4整除。因此实际占用的是8个字节,sizeof(s) = 8。一般地,可以通过下面的方法来改变缺省的对界条件:使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。使用伪指令#pragma pack.转载 2021-08-26 16:45:35 · 2033 阅读 · 0 评论 -
C语言编译常见警告
declared implicitly 隐式声明subscript out of range 下标超出范围argument of type "UINT8 *" is incompatible with parameter of type "const char *" 类型为“UINT8*”的参数与类型为“const char*”的参数不兼容expression must be a modifiable lvalue 表达式必须是可修改的左值st...原创 2021-06-24 11:33:42 · 16771 阅读 · 0 评论 -
open read write lseek写大文件的操作
头文件#<sys/types.h>#<unistd.h>#include <fcntl.h>#include <stdio.h>三个系统接口,read,write,lseek准备阶段: openint fd = open(“filename”,O_RDWR),O_RDWR为文件打开模式,具体查询open()的man手册。注:fd为文件文件描述符,使用<fcntl.h>中的open()获得读文件: read写文件: wr.原创 2021-03-18 10:45:19 · 845 阅读 · 0 评论 -
关于errno的判断
很多库函数,特别是那些与操作系统相关的,当执行失败时,需要对errno的值进行判断,判断程序是否执行失败。下面的代码利用对errno的判断,进行错误处理,似乎在清楚明白不过了,然而这却是错误的!/* 库函数调用 */if(errno){ /* 错误处理 */}出错原因在于,在库函数调用没有失败的情况下,并没有强制要求库函数一定要设置errno为0,这样errno的值就可能是前一个执行失败的库函数设置的值。下面的代码更正了一下,似乎能够工作,可惜还是错误的!errno = 0;原创 2021-03-17 17:56:16 · 874 阅读 · 4 评论 -
linux 堆栈——内存泄漏
内存泄漏有些进程并不需要管理他们的动态内存的使用。当需要时,它们简单地通过分配来获得,从来不用担心如何释放内存。这类程序包括编译器和其他一些运行一段固定的(或有限的)时间然后终止程序。当这种类型的程序终止时,所有内存都会被自动化回收。细心检查每一块内存是否需要回收纯属浪费时间,因为它们们(指前面说到的那些进程、应用程序)不会在被使用。其他程序的生存时间要长一点。有些工具如日历管理器、邮件工具,以及操作系统本身经常需要数日设置数周运行,并需要管理动态内存的分配和回收。由于C语言通常并不使用垃圾收集器(原创 2021-03-16 10:37:58 · 1147 阅读 · 0 评论 -
lseek函数用法
lseek函数:#include <unistd.h>off_t lseek(int fd, off_t offset, int whence); 返回值:若成功,返回新的文件偏移量;若失败,返回-1可以调用lseek显示地为一个打开文件设置偏移量。每个打开的文件,都有一个与其相关的“当前文件偏移量”(current file offset)...原创 2021-03-12 14:27:30 · 7370 阅读 · 0 评论 -
linux 进程数据段与堆栈空间的关系
系统进程内部的内存布局是怎样的呢?数据段,程序段,堆空间是如何分配的?先从进程的数据段开始就像堆栈段能够根虎需要自动增长一样,数据段也包含了一个对象,用于完成这样工作,这就是堆(heap),如下图显示。堆区域用于动态分配的存储,也就是通过malloc(内存分配)函数获得的内存,并通过指针访问。堆中的多有东西都是匿名的——不能按名字直接访问,只能通过指针间接访问。从堆中获取内存的唯一方法就是:通过调用malloc(以及同类的calloc、realloc等)库函数。calloc函数与mal原创 2021-03-10 18:00:56 · 429 阅读 · 4 评论 -
write函数返回值的思考
/*Begin: add by yanhaifeng in 2021.02.04 for Abnormal disconnection after TCP connection*/ret = write(fd, buf + len_sent, len - len_sent);l_error = errno;nwy_Printf("write return:%d,errno:%d", len_sent, l_error);if (ret > 0){ len_s...原创 2021-03-08 16:00:32 · 4879 阅读 · 0 评论 -
#pragma pack(n) 结构体对齐
C语言代码开发过程中,其实经常会遇到#pragma pack(n),#pragma pack(),#pragma pack(pack,n),#pragma pack(pop,n)等。并且这些语句一般出现在结构体前面。大家都知道这些是进行对齐的,但是关于是怎么对齐的,总是理解不清晰。以下是我个人总结: 在C语言编译器中提供了#pragmapack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况: 第一:如果n大于等于该...原创 2020-12-15 10:44:24 · 347 阅读 · 0 评论 -
read函数返回值的思考
read函数返回值思考原创 2021-02-22 20:17:00 · 2959 阅读 · 1 评论 -
指针数组越界的思考
#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_LENGTH 1024int main(int argc, char *argv[]){ int i = 0; char *p = NULL; char buf[MAX_LENGTH] = {0}; memset(buf, 0, sizeof(buf)); for(...原创 2021-01-18 15:22:37 · 1649 阅读 · 0 评论 -
sscanf 函数与正则表达式
#include <stdlib.h>#include <stdio.h>#include <string.h>int main(){ int time_out = 0; int range = 0; int i = 0; char string_1[100] = "cai.xiaoming:123456@192.168.1.12/share/save"; char string.原创 2021-01-07 17:33:19 · 2139 阅读 · 0 评论 -
计算任意日期是星期几
基姆拉尔森计算公式:算法是真的很高级,经常有这个感慨,越学越觉得算法很牛逼。int get_weekday_by_time(int y,int m,int d){ int w_day = 0; if(m<3) { m+=12; y--; } w_day = (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7+1; if(w_day == 7) { w_day = 0; } ret转载 2020-12-31 14:58:54 · 241 阅读 · 0 评论 -
C语言回调函数详解
示例1:#include <stdio.h>#include <stdlib.h>#if 0/回调函数的声明,只是声明了一个函数指针,这是一个指向函数的指针。/这个指针实现时,必须指向一个函数(注意是需要取函数的地址的)/ 这里面有四个点/ 1、回调函数,函数指针的声明 2、声明函数和函数指针的形参个数类型一致/ 3、有一个实现方法的函数,就是具体实现层面,比如求和、求差、求积,求商/ 4、将方法和回调函数指针结合,就是调用回调函数,这个函数的参数必...原创 2020-12-22 19:17:35 · 923 阅读 · 1 评论 -
C语言【宏定义与函数的区别】
宏与函数的区别 属性 #define 宏 函数 代码长度 每次调用时,宏代码都会被插入到程序中。除了非常小的 宏之外,程序的长度将大幅增加 函数代码只出现在一个地方,每次调用这个函数时, 调用的都是那个地方的同一份代码 执行速度 更快 存在函数调用/返回的额外开销 操作符优先级 宏参数的求值是在所有周围下上文环境里,除非给它们加 上括号,否则邻近操作符的优先级,可能会产生不可预测的结果 函数参数只在函数调...原创 2020-12-03 14:28:39 · 3069 阅读 · 0 评论 -
snprintf 函数用法详解
使用snprintf函数时要注意两点,这是我看过无数使用这个函数的程序员绝大部分都存在的两点隐患:比如: char buf[LEN]; int n = snprintf(buf, LEN, "%s%d%s", str1, int2, str3); printf("total length n %d"\n, n);1.snprintf会自动在格式化后的字符串尾添加\0, 所有格式化长度,也就是第二个参数没有必要用LEN-1, 这样会浪费一个字节的空间。...原创 2020-11-24 16:05:02 · 86860 阅读 · 13 评论 -
sizeof 数组与指针
#include <stdlib.h>#include <stdio.h>typedef struct{ int a; char buf[20];}Node;int main(){ int a[5]={1,2,3,4,5}; int *p=a; char *q=NULL; float *f=NULL; Nood *nood =NULL; printf("p = %p\n",p); i.原创 2020-12-10 20:36:42 · 11468 阅读 · 0 评论 -
C语言尾插法创建链表
/***************************************************************程序功能:用链表实现,每个节点存储每个学生的信息(学号、姓名 和某次考试的成绩),要求统计输出成绩是80分(满分 100分)以上的学生的学号和姓名。****************************************************************/#include"stdio.h"#include"s原创 2020-10-12 15:56:55 · 1874 阅读 · 0 评论