C语言
文章平均质量分 77
落尘纷扰
服务于制造业的码农,没怎么写过代码
展开
-
C语言中的二级指针(1) -- 值传递问题
先看一个我们非常熟悉的代码:#include void swap(int a, int b){ int tmp; tmp = a; a = b; b = tmp;}int main(){ int a = 3, b = 5; swap(a, b); printf("a = %d, b = %d\n", a, b); return 0;}我们都知道,这段代码中的s原创 2015-04-25 22:54:51 · 3173 阅读 · 1 评论 -
stdout行缓冲和stderr无缓冲的含义
stdout和stderr有人说stdio是带缓冲的,stderr是不带缓冲的,这并不是指fd=1和fd=2这两个设备文件,这两个设备是字符设备,本身没有缓存。并且你看一个进程的1和2两个fd指向的其实是同一个终端设备文件:[root@ubuntu]arm-code:$ ls -l /proc/8669/fd/total 0lrwx------ 1 root root 64 4月...原创 2018-06-24 22:57:25 · 2606 阅读 · 0 评论 -
指针、数组、数组指针、函数指针
1.数组和指针的大小对于指针,无论它指向何种类型(int、char或是结构体等类型),指针自身总是占用4个字节(32位的long型大小),因为指针和它指向的内容是分离开的,指针本身只保存实际内容的地址,因此其大小就是系统地址范围的大小。 对于数组,其本身就是用在存放实际内容的,因此它的大小就是这个数组实际需要的内存大小,例如数组 short score[6]; 就是定义了一个包含6个shor...原创 2018-05-02 18:56:44 · 366 阅读 · 0 评论 -
offsetof 和 container_of 的用途
offsetof() 和 container_of() 两个宏定义在Linux内核中很常见。我们在应用程序编程时可能也需要用到,因此可以把这两个宏定义copy过来。offsetof(type, member)用来求结构体type中的member成员在type中的偏移, 其定义如下:#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE ...原创 2018-04-24 19:21:06 · 645 阅读 · 0 评论 -
Linux中的字符串和字节序列处理函数
花了两天的时间总结了Linux编程时的字符串操作函数和字节序列操作函数,以便后续查阅。这些函数大都不会去检查传入的参数是否为NULL,因此在使用之前要自己做检查,否则后果你懂的。一个基本知识点: 字符串处理中,如strcpy,字符串都是以’\0’来判断结束的。 字节序列处理中,如memcpy,操作内存字节,不在乎’\0’或其他字符。下列函数基本都包含在头文件string.h中,如果...原创 2018-04-24 19:19:01 · 670 阅读 · 0 评论 -
Linux内核中的skb_queue_splice_tail_init函数
skb_queue_splice_tail_init()函数用于将链表a连接到链表b上,形成一个新的链表b,并将原来a的头变成空链表。其实现如下:/** * skb_queue_splice_tail - join two skb lists and reinitialise the emptied list * @list: the new list to add * @...原创 2018-04-06 13:26:00 · 1864 阅读 · 0 评论 -
用户程序函数调用过程中的参数传递方式
在C语言中,在调用一个函数func()时,如果func()接受不超过4个的参数,则调用者直接将实参从左到右依次赋值给r0, r1, r2, r3寄存器(如果是指针则传入地址),然后调用func()。进入func()函数后,func()将自己的栈紧接着caller的栈顶向下扩展,从r0, r1, r2, r3寄存器中拿参数,然后开始做事。而如果func()有超过4个参数,例如:int f...原创 2018-03-29 20:32:47 · 2719 阅读 · 0 评论 -
字节序 —— 大端与小端
尾端(endianness)这一词由Danny Cohen引入计算机科学,Cohen注意到计算机体系结构依照字节寻址和整型数定义之间在通信系统的关系,被划分为两个阵营。例如,一个32位的整数会占据4个字节,这样会有两种合理的方式来定义整数和各个字节之间的关系:有些计算机先从低位字节开始存放,有些则先从高位字节开始存放,Cohen将它们分别称为“小端(little-endian)”和“原创 2017-11-30 00:19:33 · 2395 阅读 · 0 评论 -
linux编程 - C/C++每线程(thread-local)变量的使用
在一个进程中定义的全局或静态变量都是所有线程可见的,即每个线程共同操作一块存储区域。而有时我们可能有这样的需求:对于一个全局变量,每个线程对其的修改只在本线程内有效,即每个线程虽然共享这个全局变量的名字,但这个变量的值就像只有在本线程内才会被修改和读取一样。线程局部存储和线程特有数据都可以实现上述需求。1. 线程局部存储线程局部存储提供了持久的每线程存储,每个线程都拥有一份对变量的拷贝原创 2016-05-12 01:10:45 · 33951 阅读 · 13 评论 -
C语言中的二级指针(2) -- 链表操作
一个链表中所有元素通过指针串联起来,链表的插入、删除等操作都是对指针的操作。使用指针操作链表例如,下面的代码段实现了一个删除链表节点的函数,很多人都会采用类似的代码删除链表节点。/* 结构体定义 */struct testdata{ struct testdata * next; //指向链表下一个节点的指针 int id;};/* 链表头 */struct testd原创 2015-04-25 22:38:57 · 6049 阅读 · 2 评论 -
sscanf的高级用法
原博地址:http://blog.csdn.net/noodies/article/details/4386570printf或者sprintf一定是任何一个C程序员最常见到的函数,与sprintf的作用相反,sscanf通常被用来解析并转换字符串,其格式定义灵活多变,可以实现很强大的字符串解析功能。 sscanf的原型很简单,定义如下:#include int转载 2015-08-20 08:34:31 · 1649 阅读 · 0 评论 -
exit() 和 _exit() 的区别
exit()和_exit()的效果都是让程序退出执行,而_exit()用来“尽快”退出。atexit()先说一下atexit()函数。我们可以用atexit()注册一个或多个函数退出清理函数(或者on_exit()但这个函数不建议用),这些清理函数按照注册时的反顺序,在exit()或main函数return时被调用。#include <stdlib.h>int a...原创 2018-06-24 22:58:55 · 1343 阅读 · 0 评论