自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(16)
  • 问答 (1)
  • 收藏
  • 关注

原创 一道面试题引发的头脑风暴(既有趣,又无趣的fork)

从昨天到现在一直在想一个跟fork有关的测试题,这个测试考察了逻辑运算知识以及对fork的理解,据说是一道什么EMC的测试题,这个题是我从学习群里看到的,还真别说这题把我头都搞胀了,这种题就是纯逻辑题,对fork的理解程度如何,fork的返回值有两个,就让问题变得很抽象。经过我的不懈坚持,今天终于把这个题目背后的逻辑,以及技巧悟透了,想分享给大家,网上的很多帖子我都不想说啥,不管对与错,直接复制粘贴,有啥用呢,你自己都没理解透,还写什么文章去误人子弟。废话不多说,接下来直接进入正题:原题是这样的 :in

2021-10-03 12:28:12 198

原创 结构体大小计算(全网原创)

之前我就对结构体大小的计算总结过,但是没有记录下自己的总结,时间长了就会忘记,这次又遇到了需要计算结构体大小,那没办法,就当复习。CSDN的风气一直不好,基本TMD都是抄袭,你抄我,我抄你。离国外的差距远着,别的不说了,直接上干货计算结构体的步骤我总结如下:首先明白自己用的是什么开发环境,举个例子,如果你用的是VS,那么VS里的默认字节对齐数是8,这个8是怎么来的,很容易验证:struct S{ int a; double b; short c; char d;};你试着计算下这个结构

2021-09-07 10:51:29 283

原创 进程通信之有名管道(双向通信)

有名管道

2021-07-13 15:34:36 1763

原创 进程通信之无名管道(双向通信)

进程间的通信方式有多种,最典型的无名管道,有名管道,二者的区别在于,无名管道适用于小规模,具有血缘关系的进程间通信,有名管道适用于小规模,无血缘和有血缘的进程间通信,管道的实质是:内核开辟的一端缓存区,一端读,一端写。两端默认都是阻塞状态想要实现双向通信就得创建两个管道,因为管道是半双工,写的时候就只能写,读的时候就只读,数据的传输是单向的,如果要实现双向,就必须增加一根管道。下面直接上demo:#include <stdio.h>#include <unistd.h>#in

2021-07-11 11:46:58 741

原创 进程通信之共享内存

shm_ipc_snd.c:发送端#include <stdio.h>#include <sys/ipc.h>#include <sys/shm.h>#include <sys/types.h>#include <string.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h> #define PATHNAME ".

2021-07-08 11:40:03 97

原创 条件变量加互斥锁实现生产者——消费者模型(C语言)

1. 什么是条件变量?通俗的讲就是当满足某个条件的时候我们就让程序干我们想干的活,条件不满足那就让它阻塞,等到条件满足为止。2. 什么是互斥锁?互斥锁其实就是用来保护共享资源的一种锁,当多个线程访问共享资源的时候(比如全局数据,堆区开辟的空间)就需要使用互斥锁,才能达到线程同步的效果,这里的同步不是指一起,相同,而是协同的意思,是有先后顺序的。条件变量函数调用:条件变量初始化函数 int pthread_cond_init(pthread_cond_t *restrict c

2021-07-02 14:29:41 642

原创 C语言static 关键字的作用

static 的作用如下:1.static定义的静态全局变量static定义的静态全局变量只可以在本文件中被使用,比如你在1.c源文件中定义了一个静态的全局变量,你这时候又新建了一个叫2.c的源文件,那你想在2.c中用extern 声明这个在1.c中定义的静态全局变量并且使用它,没用,用不了。2.static定义的静态局部变量static定义的静态局部变量,因为是局部变量,那肯定是在某个函数内定义的,所以只可以在这个函数内使用你定义的这个静态局部变量,但是static定义的静态变量,不管是局

2021-04-05 17:09:51 507

原创 C语言链表的创建,增删,排序

索性写写链表程序,直接上代码:#include<stdio.h>#include<stdlib.h>struct Node{ int data; struct Node* Next;};//生成链表的节点void CreatNewNode(struct Node* Head,int lenth){ int i=0; for(i=0;i<lenth;i++) { struct Node* NewNode=(struct N

2021-04-03 17:13:36 126

原创 C语言offsetof宏实现

offsetof是一个宏,它不是函数。下面的图是offsetof的宏定义**offsetof括号里有两个参数,一个是结构体的类型,一个是结构体里面的成员(size_t)其实就是unsigned int类型, s 是结构体类型,s *是结构体指针,(s *)0就是把常量0强制转换为结构体的首地址,相当于把结构体中第一个成员的地址假设为0.此时结构体的第一个成员的地址其实就是结构体的首地址,(s *)0)->m就是访问结构体里面的成员,之后用&把成员的地址取出来,再把取出来的地址强

2021-03-23 19:17:44 365

原创 C语言自己实现strstr函数功能

本人没参考任何strstr函数的标准源码,自己摸索了一天不断调试,不断修改按自己的逻辑才写出这个字符串查找函数的算法,查找字符串不像一般的字符串复制和连接,情况更复杂,每一种情况都要能查出来,差点就放弃了strstr函数的功能是字符串查找:代码:#include<stdio.h>#include<string.h>char* my_strstr(const char* str1, const char* str2){ char* s1 = NULL; char* s

2021-03-11 15:21:58 1146

原创 C语言实现strcpy函数

自己实现strcpy函数的功能:编程思路:1.封装一个函数专门用来复制字符串的2.把要复制字符串的首地址和接收复制的字符串的首地址传给函数3.逐个复制,包括 ‘\0’4.返回接收复制的那个字符串的首地址代码如下:#include<stdio.h>char* my_strcpy(char* left, const char* right)//防止字符串复制反所以加 const{ assert(left!=NULL); //防止传入的是空指针 assert(right!=NU

2021-03-07 20:58:04 1300

原创 C语言自己实现strlen函数

自己实现strlen函数的功能:编程思路:1.strlen是用来计算字符串长度的,遇到 '\0’结束2.封装一个函数用来专门计算字符串的长度3.把字符串的首地址传给函数4.定义一个变量记录字符个数,while循环判断有没有到 ‘\0’,没有就自加5.返回字符的个数#include<stdio.h>#include<assert.h> int my_strlen(const char * str) //const 防止传进来的字符被更改{ assert(str

2021-03-07 20:32:40 928 1

原创 C语言打印杨辉三角

打印杨辉三角,如图所示:编程思路:1.把杨辉三角看成二维数组2.对每一个数组元素初始化3.打印每一行的空格4.打印每一行的元素#include<stdio.h>#define ROW 5 //杨辉三角的行数#define COL 5 //杨辉三角的列数void PrintYangHuiTriangle(){ int a[ROW][COL] = { 0 }; //把杨辉三角看成是一个二维数组 int i = 0; int j = 0; for (i = 0;

2021-03-07 20:02:40 358

原创 C语言打印菱形

打印菱形,结果如图所示:编程思路;1.把菱形分成上下两个部分,分别打印2.先打印每一行的空格3.再打印每一行的 *4.打完一行就换行,接着打下一行假设我要打印任意行数的菱形,代码如下:#include<stdio.h>int main(){ int i = 0; int j = 0; int lenth = 0; printf("输入要打印的行数:"); //要打印的上部分的行数 scanf("%d", &lenth); //打印上部分 for (i

2021-03-07 12:01:10 1023

原创 C语言程序内存四区——栈区,堆区,全局区,代码区

1. 全局区:全局区比较特殊,里面还分成了全局变量区,静态变量区,常量区。全局变量区用来存放全局变量,静态变量区用来存放带有static修饰的变量(包括静态局部变量和静态全局变量),只要含有static就存在这个区。常量区是用来存放字符常量的,还有const修饰的全局变量的,const 修饰的局部变量不存在这里,别搞混了。全局区存放的一切都是由操作系统管理,等程序结束由操作系统释放。常量区里存放的数据不可更改,就算你用指针也不行,你可能会说const修饰的局部变量都可以用指针改,但是局部变量可不是存放在常量

2021-02-14 12:29:24 6698

原创 scanf( )函数与gets函数使用细节介绍

C语言中有关 scanf( ) 函数和 gets( ) 函数以及getchar( )函数的一些使用细节学过C语言的人都知道 scanf( ) 函数和 gets( ) 函数以及 getchar( ) 函数的作用,今天我们就来讲讲具体的细节,直接上代码:1. scanf( )函数用来读取字符串:#include<stdio.h>#include<string.h>int main(){ char str1[100]; char str2[100]; char ch1;

2021-02-12 17:09:25 1016

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除