C
杨博东的博客
阿里云数据库-NoSQL组,开源贡献者,Valkey Contributor,Valkey-Java Client Maintainer。
展开
-
glibc memcpy() 源码浅谈
其实我本来只是想搞懂为什么memcpy()函数的参数类型是void *的:我以为会在memcpy()源码中能找到答案,其实并没有,void *只是在传递参数的时候起了作用,可以让memcpy()接受不同的指针类型,比如char *,double *,struct stu *等等,没错,只是这样,至于memcpy()内部的工作原理,请继续往下看。没办法,我只好去找找memcpy的源码。代码如下。 备原创 2016-11-19 09:35:04 · 6443 阅读 · 7 评论 -
#ifndef #define #endif #ifdef 避免重复引用
一:在什么阶段处理 ?预处理 预处理 预处理首先注意这四个头文件保护符是在预处理阶段由系统默认的预处理器(Linux操作系统上默认是cpp)来处理的。它们的含义如下:#define XXX // 将XXX声明为一个预处理变量#ifndef XXX // 当且仅当XXX没有被定义为"真"#ifdef XXX // 当且仅当XXX被定义时为"真"#endif原创 2016-12-07 00:36:21 · 2931 阅读 · 1 评论 -
C语言的“隐式函数声明”违背了 “前置声明” 原则
这个问题来源于小组交流群里的一个问题: 最终问题落脚在 : 一个函数在main中调用了,必须在main之前定义或者声明吗?我在自己的Centos上做了实验,结果是函数不需要,但是结构体(变量也要)需要,如下图: 编译上面的程序,func函数只是一个警告,因此我以为C编译器不管前置声明,然后又测试了c++的编译器,发现不能通过编译,直接报错。 然后查询到C++前置声明的相关资料,强制要求前置声明原创 2017-10-09 22:21:01 · 1577 阅读 · 0 评论 -
布尔运算 逻辑运算 移位运算
1:四种布尔运算&,|,^,~&:相当于&&,表示”与”运算。一假则假。 |:相当于||,表示”或”运算。一真则真。 ^:表示”抑或”,相同状态则为假。 ~:表示”非”,相当于!。 运算 结果 a [01101001] b [01010101] ~a [10010110] ~b [10101010] a&b [01000000] a|b [原创 2016-02-26 15:34:46 · 4364 阅读 · 1 评论 -
C语言图书管理借阅系统——ncurses库的使用
一、前言作为一只大四狗,最近还跟着大二同学修了一门课(当然不是之前没通过啦),课程是高级语言课程设计,高级语言指的是C语言 :),内容是做一个XX管理系统,我选择了图书管理系统,先介绍下我做的系统:主要功能: 读者信息管理:添加、修改、删除、查询读者信息。图书信息管理:添加图书、修改图书、删除图书、查询图书图书借阅归还:图书借阅和归还,以及列出借阅情况。信息统计汇总:图书总量统计、图书借阅原创 2017-12-28 15:41:47 · 6092 阅读 · 5 评论 -
Hello World之编译链接装载与执行(1)
一:前言我打算写一系列博客来说说我对Hello World在计算机中的生命旅程的理解,我是一名软件工程专业的大三学生,有关这个问题我主要的参考书有《深入理解计算机系统》、《现代操作系统》、《程序员的自我修养》,除了这些,我还参考了一些大牛的博客,如果后面需要,我会贴出来,我还在我的Centos 7系统上做了一些验证。如果上面的三本书你都看过,并且看的还算认真,能回答这个问题 https://www.原创 2016-11-30 23:00:33 · 1307 阅读 · 3 评论 -
void * 是什么?
最近遇到void *的问题无法解决,发现再也无法逃避了(以前都是采取悄悄绕过原则),于是我决定直面它。在哪遇到了? 线程创建函数pthread_create()的最后一个参数void *arg,嗯?传地址还是传值?传值好像有警告。还有别的出现的地方呢看memcpy(),返回值和参数都有void *,那又怎么传呢?下面我们首先来说说void *是什么。一:void *是什么?C语言中,*类型就是指针原创 2016-11-19 09:12:21 · 28278 阅读 · 10 评论 -
const int * p 和 int const * p 和 int * const p 的区别
首先注意,const int * p 和int const *p 是一样的,并且不管是不是*p,即使const int i和int const i也是一样的,所以我们接下来只讨论int const * p和int * const p的不同对于这种问题,我们只用将const 的位置固定,然后再看后面的东西,一般规则是后面的东西不能在进行赋值或者修改原创 2016-01-14 16:19:13 · 3764 阅读 · 7 评论 -
有关内存对齐的问题
两大规则: 1:某个成员距离首位置的偏移量最小是该成员大小的一倍。 2:所有成员的大小之和应该是最大成员大小的整数倍。原创 2015-10-21 18:26:09 · 590 阅读 · 0 评论 -
linux下c语言实现简单----线程池
这两天刚好看完linux&c这本书的进程线程部分,学长建议可以用c语言实现一个简单的线程池,也是对线程知识的一个回顾与应用。线程的优点有好多,它是”轻量级的进程”,所需资源少,多线程共享数据空间,线程之间切换速度更快,可以减少服务器的闲置时间等。那么我们要在往高层次讲它也有一些缺点,比如一个多线程的程序在创建和销毁线程的时候是比较费资源的,举一个例子,我们要是自己是一个普通饭店老板,当顾客来了我们再原创 2015-08-05 19:16:49 · 2481 阅读 · 2 评论 -
指针与数组,指针与函数,指针与字符串
一:指针与数组首先我想解释清楚指针与数组名的关系,由下面的代码引入问题,不知道大家有没有好奇过为什么它们三个是一样的?#include<stdio.h>int main(int argc,char *argv[]){ int a[5] = {1,2,3,4,5}; printf("%p %p %p\n",a,&a,&a[0]); return 0;} 那我们在看下面代原创 2016-01-17 19:04:01 · 892 阅读 · 0 评论 -
简单理解函数声明(以signal函数为例)
这两天遇到一些声明比较复杂的函数,比如signal函数,那我们先简单说说signal函数的用法:(参考《c陷阱与缺陷》) signal:几乎所有c语言程序的实现过程中都要用到signal函数,作为捕获不同步的一种方式。我们用户要调用signal函数,可以这样使用,首先在头文件中加入:#include<signal.h> ,然后我们可以这样调用signal函数:signal(signal typ原创 2016-01-17 19:10:07 · 1028 阅读 · 0 评论 -
typedef的用法 单向链表的查找、增加、删除、销毁。
一:typedef的用法。 写一个数据结构(计算机存储数据的一种方式,是抽象的,可以人为组织,提高算法效率),我们需要注意:接口友好,模块化,规范命名等方面,在接口友好方面,typedef是非常好用并且标准及人性化的。/*定义一个叫student的结构体*/struct student{ int Id; char name[20]; };struct st原创 2016-01-17 19:15:32 · 1723 阅读 · 2 评论 -
有关unsigned和有符号类型的区别
相信大家对于unsigned这个玩意并不陌生,但是有的时候却会被它搞懵,比如下面:#include<iostream>using std::cout;using std::cin;using std::endl;int main(int argc,char *argv[]){ char a = 255; char b = 256; unsigned char c = 2原创 2016-01-22 18:32:28 · 968 阅读 · 0 评论 -
char* 和 char[] 的区别
一、代码有关下面代码,p和q的区别是什么:int main(int argc, char *argv[]){ char* p = "Hello World"; char q[] = "Hello World"; return 0;}二、区别和解释p和q的区别是: p 是一个指针,指向程序 只读数据段 的”Hello World”,不可以通过p[x] = x 来赋值,原创 2018-03-18 23:53:56 · 1184 阅读 · 1 评论