
C语言
文章平均质量分 78
C语言开发相关编程知识积累
浮云流响
代码强国。
展开
-
Linux进程间通信 - (二) 信号
Linux进程间通信 - (二) 信号1. 概述信号是在软件层面上对中断机制的一种模拟。在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说在某种程度上是一样的。信号是异步的:一个进程不必通过任何操作来等待信号的到达。事实上,进程也不知道信号什么时候会到达。信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户进程发生了那些系统事件。信号可以在任何时候发给某一进程,而无需知道该进程的状态。如果该进程当前并未处于执行态,则该信号就由内核保存起来,直到原创 2021-12-29 17:16:50 · 912 阅读 · 0 评论 -
C语言 -- 常见字符串处理函数总结
C语言常用字符串函数文章目录C语言常用字符串函数一、基础知识1. 常量指针与指针常量2. 字符串的存储区3. 字符串长度二、字符串处理函数1. 字符串长度计算2. 字符串复制3. 字符串拼接4. 字符串比较函数5. 格式化字符6. 字符串查找7. 字符串分割三、总结一、基础知识为了更好的理解后面提到的一些字符串处理函数,我们先补充一些基础知识。假如你已经掌握,可以直接跳过。1. 常量指针与指针常量先来看一个例子:int a = 100; const int * p = &a; //常量原创 2021-12-24 19:53:03 · 1588 阅读 · 0 评论 -
C语言拾锦 --- 对指定的结构体数组成员进行初始化
对指定的结构体数组成员进行初始化概述今天在看iwlib库(一个开源的基于wext的wifi驱动的管理的库,可以支持我们在应用层面对wifi进行一些方便的操作)代码的时候发现了一种比较有用的对结构体结构体数组成员的初始化的方法,之前没有遇到过。第一次见有点儿新奇,在这里做一下记录。先贴出代码(对源代码进行了一定的简化):/* Describe how a standard IOCTL looks like. */struct ty_ioctl_description{ __u8 hea原创 2021-09-27 16:56:17 · 2698 阅读 · 2 评论 -
C语言基础 --- 结构体中的.和->的区别与联系
C语言基础 — 结构体中的.和->的区别与联系1. 基本功能这两种方式其实都是结构体成员运算符,两者都具有从左到右的结合性。不同的是:'.'是结构体引用成员变量的方式。'->' 是结构体指针引用成员变量的方式。2. 联系那么既然有了’.‘这个符号,为什么还要再弄个’->‘符号呢?这不是很麻烦吗?然而,事实并非如此,’->'恰巧是为了我们更好的使用结构体这一有利的工具。请看下面这个小例子。#include <stdio.h>struct ptr { i原创 2021-09-12 18:01:39 · 3303 阅读 · 1 评论 -
C语言 --- 一个简单内存池模型的实现
C语言 — 简单的内存池实现内存时原理说明模拟C语言内存分配函数malloc()和free(),我们这里也定义两个函数alloc和afree,进而模拟C语言内存的分配的实现。定义一个大的字符数组,模拟一块内存池。让alloc对一个大的字符数组allocbuf中的空间进行分配,该数组是alloc和afree两个函数私有的数组。由于alloc和afree处理的对象是指针而不是数组下标,因此,其他函数无需知道该数组的名字,这样可以在alloc和afree处理的对象是指针而不是数组下标,因此,其他函数无原创 2021-08-01 22:57:10 · 1210 阅读 · 13 评论 -
C语言 --- Register 寄存器变量解析
Register 寄存器变量定义register声明告诉编译器,它所申明的变量在程序中使用频率较高。其思想是:将register变量房子机器的寄存器中,这样可以使程序更小、执行速度更快。但是编译器可以忽略此选项。用法register 只适用于自动变量以及函数的参数。register申明变量的形式如下:register int a;int register b;这两种形式都是可以的,但第一种会简单明了一些。register申明函数参数int func(register char原创 2021-06-05 21:40:11 · 2415 阅读 · 0 评论 -
C语言中的类型转换
类型转换C语言中,类型转换可以说是非常复杂的存在了。有符号、无符号,整数、浮点数等等,C语言中定义了这么多类型。而很多类型之间的转换,C标准中并没有做很详细的规定。如果不对这些转换有一个基本的认识的话,那么难免会留下隐患。本文将从四个方面,对C原因中的一些隐式的类型转换做一些总结。整型提升一个C表达式中,方式可以用int、unsigned int类型做右值的地方都可以使用有符号或者无符号的char型、short型和位域。如果原来类型的取值范围能够用int表示,则其类型被提升为int,如果原始类型原创 2021-01-31 19:34:36 · 1064 阅读 · 0 评论 -
C 语言拾锦 —— ##和#预处理标记的用法及原理分析
先说结论:我们先来看一个例子,理解其第一点用法,并且熟悉下这种用法:将其进行编译后,两个printf都会输出:那么它具体是怎么实现的呢?其实很简单就是在其宏变量被替换,在其左右两侧加上双引号。为了探究这个过程,我们在用gcc编译的时候加上-E选项来看下编译器的预处理过程:可以看到,gcc编译器的预处理过程和我们的猜想是一致的,预处理标记的作用确实只是在我们指定的参数两旁加上双引号使其成为一个字符串了。这里也可以看出预处理标记的工作原理了。可以看到上面的例子中没有换行,我们将其晚上一下。提供两种思路原创 2020-08-09 22:23:26 · 2376 阅读 · 1 评论 -
C语言基础--宏函数
C语言基础–宏函数1. 函数和数据类型函数式宏(宏函数)和函数类比会更加灵活,我们通过两个例子来看一下。函数#include <stdio.h>int sqr_int(int x){ return x*x;}double sqr_double(double x){ return x*x;}int main(int argc , char *argv[]){ int n; double x; printf("请输入一原创 2020-06-07 15:43:45 · 28333 阅读 · 10 评论 -
C语言 --- void的用法解析
C语言 - void的用法解析简介 void 中文翻译为"无类型",有的也叫"空类型"。常用在程序中对定义函数的参数类型、返回值、函数中指针类型进行声明。用法 void应用最广泛的就是跟指针结合,即void * //无类型指针,也称为空指针,可以指向任何类型的数据 //注意一点:当我们需要使用void 类型的的指针变量区指向 某一类型的变量的时候,必须要对其进行类型转换 这里补充一点:因为我们在定义一个指针变量的时候第一件事就是指定我们指针变量所指向的变量的类型。一原创 2020-05-24 14:26:03 · 70248 阅读 · 4 评论 -
《剑指offer》在字符串中替换另一个字符串
将字符串中的某些字符做替换一、简介将一个字符串中的,某一个字符或者字符串替换成另一个字符或字符串。根据《剑指offer》中讲到的思想,下面来做一个分析。我们可以先遍历一次字符串,这样就能计算出替换之后的字符串的总长度。也就是说,如果我们原来字符串中的某一个字符替换成某一个更长的,那么替换之后字符串的总长度就会变长。此一步骤的目的就是,计算出替换后总长度,才好分配内存去存储。例如:...原创 2019-08-11 18:58:37 · 289 阅读 · 0 评论 -
C语言基础--程序结构和控制语句
四、程序结构和控制语句C语言汇总程序结构的分类顺序结构分支结构循环结构C控制语句条件判断语句if语句1.if(表达式) 语句2 若表达式的值非0,则代表真,执行语句2;表达式的值为0的话,则代表假,不执行语句2。2.if(表达式) 语句1 else 语句2 这是一种双分支结构,若判断表达式为真,则执行语句1否则执行语句2。注意:语句必须以;结尾3....原创 2019-07-28 17:12:45 · 322 阅读 · 0 评论 -
C语言--野指针形成的原因及解决办法
野指针1.关于野指针1.野指针是指向垃圾内存的指针,而不是NULL;或者说是指向未知内存的指针,2.野指针形成的原因1.指针P被free掉了,却没有将其置为NULL。free函数只是将指针所指向的内存释放掉了,使得内存成为自由内存,但是并没有把指针本身的内容清除掉,所以指针仍指向已经释放的动态内存。这是很危险的。2.没有及时初始化指针。3.指针操作超越了变量的作用域范围...原创 2019-07-31 19:52:53 · 1009 阅读 · 0 评论 -
C语言--内存管理
内存管理C语言中,定义了四个内存空间:代码区、全局变量与静态变量区(静态存储区)、局部变量区即栈区、动态存储区,即堆区。1.代码区:主要存放程序中的代码,属性为只读。(也叫text段)2.全局变量与静态变量区:也称静态存储区,该块内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在,如:全局变量、静态变量、字符串常量。当程序结束的时候才释放该块内存。(也分为data段(初始化...原创 2019-07-31 19:31:06 · 303 阅读 · 0 评论 -
C语言基础--宏定义、文件包含、条件编译
预处理所谓预处理是指进行编译的第一遍扫描(词法扫描和语法分析)之前所做的工作。系统会自动将’#'开头的预处理部分做进行处理,处理完毕后进行进入源程序的编译阶段。C语言中提供多种预处理功能,如宏定义、文件包含、条件编译等。预定义在C语言源程序中允许用一个标识符表示符号,称为宏,被定义为宏的标识符称为宏名。对程序中出现的所有宏名,都用宏定义中的符号串去替换,这称为宏替换或者宏展...原创 2019-07-31 19:28:12 · 1357 阅读 · 0 评论 -
C语言基础--二进制的原码、反码、补码
二进制的加减运算(原码,反码,补码的理解) 最近又看了,二进制加减法运算。对于很多新人可能对于二进制的加减法运算有不理解的地方,下面我将自己 的一些理解写下来,一方面做一些记录,另一方面希望能对大家有帮助。计算机中数据的存储 我们都知道计算机智能识别机器语言即0和1,那么我平时的十进制数在计算机中是如何存储的呢?计算机需要将其转换成二进制进行存储,即以0 和1的形式来表示。 下面以单字节...原创 2019-03-23 23:19:23 · 1538 阅读 · 0 评论 -
C语言--printf函数参数出栈入栈问题
printf函数参数出栈入栈问题1.问题[外链图片转存失败(img-gXBCOQqE-1562567906606)(C:\Users\asus\AppData\Roaming\Typora\typora-user-images\1562566379137.png)]编译环境为GCC,可一看出结果和我们预想的有很大的区别,那么想一下,为什么会这样?2.分析在处理printf时,压栈...原创 2019-07-08 14:38:41 · 1170 阅读 · 0 评论 -
C语言基础--数据类型
最近在回顾C语言的知识,笔记中的东西都是自己慢慢敲的加上总结。一、数据类型基本类型整型浮点型字符型枚举型指针型空类型空类型构造类型数组结构体共用体整型分为长整形(long int、long long int)、整型(int)、短整型(short)。在32为机中短整型占2个字节、其余的各占4个字节。涨肚一般遵循:短整型 <= 整型 ...原创 2019-07-14 09:22:13 · 390 阅读 · 0 评论 -
C语言基础--DATA段、BSS段及TEXT段与程序文件的大小
1.DATA段 用来存储已经初始化的全局变量,属于静态内存分配区,会占用程序文件空间。2.BSS段 用来存储未初始化的全局变量,也属于静态内存分配区,但是不会占用长须文件空间。3.TEXT段 即代码段,用来存储程序指令,会占用文件空间。总结 DATA和BSS都属于内存的静态存储区,用来存储全局变量。DATA用来存储初始化过得全局变量,BSS用来存储未初始化过得全局变量(...原创 2019-06-30 18:59:39 · 2874 阅读 · 0 评论 -
段错误的定位方法
有些时候我们在一段C代码的时候,由于对一个非法内存进行了操作,在程序运行的过程中,出现了"段错误"。呵呵,这种问题我想很多人会经常遇到。遇到这种问题是非常无语的,只是提示了"段错误",接着什么都没 有,如果我们一味的去看代码找太疼苦了,因为我们都相信自己写的代码没问题,现实就是现实。下面介绍一种方法,可以有效的定位出现"段错误的地方"。当我们的程序崩溃时,内核有可能把该程序当前内存映射到...转载 2019-06-30 19:37:07 · 2266 阅读 · 0 评论 -
C语言笔记(2) -数据的输入、输出
二、数据的输入输出字符输出函数int putchar(int c) : 功能:在标准输出上面显示一个字符格式化输出函数int printf(const char *format…) : 功能:格式化字符串输出常用的格式:格式符作用i,d十进制整数x,X十六进制无符号整数o八进制无符号整数%%百分号本身s字符串f小数...原创 2019-07-19 19:11:49 · 371 阅读 · 0 评论 -
C语言--逗号运算符及逗号表达式
逗号运算符及表达式C语言中","也是一种运算符,称为逗号运算符。其功能是将两个或多个表达式连接起来组成一个表达式。具体形式如下:表达式1,表达式2,表达式3,...,表达式n举个例子:如:y=(x=a+b),c+d;本例中,y是整个表达式的值,也就是表达式2的值,x是第一个表达式的值。对于逗号表达式:逗号表达式一般形式中的表达式1,和表达式2也可以是逗号表达式的值。将其...原创 2019-07-26 09:19:06 · 6794 阅读 · 2 评论 -
C语言基础总结-运算符与表达式
运算符和表达式算术运算符运算符描述结合性+单目正/双目加从右到左/从左到右-单目负/双目减从右到左/从左到右*乘从左到右/除和整除从左到右%取模(取余)从左到右总结 :除法运算符包括除和整除两种运算,当除数和被除数都是整型数时,结果只保留整数部分而自动舍弃小数部分,0不能作为除数。除数和被除数只要有一个浮点数,进行...原创 2019-07-26 09:28:36 · 717 阅读 · 0 评论 -
C语言基础 -- 数组
数组数组的定义数组是一组数据的集合,用于将一种类型的数据存储到一段连续的空间中,可在一定程度上面加快搜索速度。组成数组的元素是若干个独立的变量,这些变量的类型必须相同。按照数组元素的类型的不同又可以分为:数值数组、字符数组、指针数组、结构体数组等。数组属于构造类型。<存储类型> <数据类型> <数组名> [<常量表达式>...原创 2019-07-31 19:11:38 · 833 阅读 · 0 评论 -
C语言基础--指针详细分析
指针指针变量定义在计算机内部每一个字节单元都有一个编号,称为地址。内存单元的地址称为指针,存放指针的变量称为指针变量。计算机位数对应于地址的字宽,32位计算机的字宽就是32位的,也就是4个字节。(所有类型(int*,char*,struct*,数组等)的指针都是32位的,即4个字节的)类型说明符* 变量名*表示一个指针变量,类型说明符表示指针所指向的数据类型。虽然所有的指针都等...原创 2019-07-31 19:18:44 · 459 阅读 · 0 评论 -
C语言基础--函数(指针函数、函数指针、回调函数、递归函数)
函数函数的定义和声明1.函数定义<数据类型> <函数名称> (<形参列表>){ 语句序列; return ( );}若缺省返回值类型则会默认为int型。函数名即函数的入口地址函数的声明 即将函数的相关信息告诉编译器,如此才能使用函数。函数必须先声明才能使用。函数的参数传递1.值传递a.形...原创 2019-07-31 19:21:17 · 421 阅读 · 0 评论 -
C语言基础--用户自定义的数据类型(结构体、结构体数组、共用体、枚举)
自定义的数据类型结构体结构体的定义struct 结构体名{ 数据类型 成员名1; 数据类型 成员名2; ...};结构成员中可以为结构体类型;结构体成员可以为联合体类型;结构体成员也可以是基本数据类型;注意:结构体在定义时不分配内存,只有用它定义变量是才分配内存。结构体变量的声明、使用及初始化先声明结构体类型,再定义结构体变量...原创 2019-07-31 19:25:38 · 3560 阅读 · 0 评论 -
C语言--static标识的静态变量
变量的存储方式 变量的存储方式主要分两种:静态存储方式和动态存储方式。静态存储方式是指程序运行期间由系统分配固定的存储空间的方式,而动态存储则需要根据需要进行动态存储空间分配的方式。也就是用时系统就给分配内存,不用试就释放。1.静态局部变量 这个一般是在函数中定义的,有时候希望函数调用结束后局部变量的值不消失而继续保留原值,即占用的存储单元不释放,在下一次再调用该函数时,该变量已有值,即上...原创 2019-03-29 23:26:39 · 315 阅读 · 0 评论