Welcome 微信登录

首页 / 软件开发 / C语言

linux下生产者与消费者C实现

linux下生产者与消费者C实现

linux下生产者与消费者C实现2015-02-23最近做毕设涉及到了生产者与消费者模型,这个东东只在操作系统课程上有点印象,于是花了点时间看了下《unix环境高级编程 》的线程部分,在此记录一下。1.多线程的概念就不多说了,pthread.h头文件中包含的几个基本概念及函数:pthread_t————线程ID数据类型,线程ID只在它所属的进程环境中有效;int pthread_create(pthread_...
c编程中的堆与栈

c编程中的堆与栈

c编程中的堆与栈2015-02-23栈与系统的设计有关,由系统来管理。不过,程序员可以通过如new malloc语句在堆中获取内存。栈是向下生长的一块连续的内存区域。栈的大小是系统设置好的。堆是向上生长,不连续的内存区域。因为操作系统是用链表来管理内存的。堆的大小受系统有效虚拟内存的限制。栈: 在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令的地址,然后是函数的各个参数,注意静态变量是不入栈的。当本次函数调用结束后,局部变量先出栈,然后是参数,最...
do {...} while (0) 的常见用途

do {...} while (0) 的常见用途

do {...} while (0) 的常见用途2015-02-23在一些Linux内核和其它的开源代码中,我们经常看到像下面这样的代码:do{ ...}while(0)该代码片段并非循环,这样想想似乎使用do…while没有任何意义,那么为什么还要使用它呢?实际上,do{...}while(0)的用途并不仅仅是优化你的代码。经过一系列的调研和探索,我们总结出它的一些用途如下。1. 帮助定义复杂的宏以避免错误详细解释请看“do {...
do {...} while (0) 在宏定义中的作用

do {...} while (0) 在宏定义中的作用

do {...} while (0) 在宏定义中的作用2015-02-23如果你是一名C程序员,你肯定很熟悉宏,它们非常强大,如果正确使用可以让你的工作事半功倍。然而,如果你在定义宏时很随意没有认真检查,那么它们可能使你发狂,浪费N多时间。在很多的C程序中,你可能会看到许多看起来不是那么直接的较特殊的宏定义。下面就是一个例子:#define __set_task_state(tsk, state_value) do{ (tsk)->state = ...
linux下C语言学习:通过几个实例温习指针

linux下C语言学习:通过几个实例温习指针

linux下C语言学习:通过几个实例温习指针2015-02-23作为新手,起初玩vim还是蛮痛苦的。不过慢慢尝到甜头后也很难放下了。本篇带一样很久没玩c的同学温故下指针。step 1直接上图了这里我们定义一个二维数组int a[2][5] = {1,3,5,7,9,2,4,6,8,10};左边文件我们声明一个普通指针 将二维数组的内容填充进来我们来看看运行的结果结论我就不总结了 和大家的想法一样右边文件我们声明一个指针数组来存放我们再看看右边文件的运行结果...
linux下学习C语言:神器 vim + 指针相关客串

linux下学习C语言:神器 vim + 指针相关客串

linux下学习C语言:神器 vim + 指针相关客串2015-02-23前篇回顾上篇介绍了linux下C编程基本环境配置以及相关工具使用选择。不过10个大牛9个用vim,那么咱们就来玩vim。linux下玩c就别依靠图形界面。好吧告别Ide,命令行才是c的王道。本篇文章感谢名为孙鹤同学的技术支持 感谢有爱的c大牛们本文中多处使用vim插件(孙鹤提供),这些插件大多是在http://www.vim.org/处下载。指针客串因为毕业后就没玩过c了,都说指针是...
KEIL的ARM编译器对RW和ZI段的一个处理

KEIL的ARM编译器对RW和ZI段的一个处理

KEIL的ARM编译器对RW和ZI段的一个处理2015-02-23按照C编译器编译的结果,一般会产生RO段,RW段,ZI段。RO是程序中的指令和常量,RW是程序中的已初始化全局变量,ZI是程序中的未初始化或初始化为零的全局变量。那么如下的代码int aaa;int bbb;int main(){aaa = 7;bbb = 8;return 0;}应该产生的是八个字节的ZI段,但很奇怪,--bss_threshold=0Program Size: Code=...
C程序中唯一序列号的生成

C程序中唯一序列号的生成

C程序中唯一序列号的生成2015-02-23在实际的软件开发项目中,经常会涉及唯一序列号的生成。本文以一个实际的程序为例,介绍了唯一序列号的生成过程。本文生成的序列号的样式为:MMDDHHMINSS_XXXXXX。程序如下:* 修改记录1:// 修改历史记录, 包括修改日期、版本号、修改人及修改内容* 修改日期: 20140603* 版 本 号: V1.0* 修 改 人: Zhou Zhaoxiong* 修改内容: 创建******************...
链表的建立、插入和删除

链表的建立、插入和删除

链表的建立、插入和删除2007-05-03数组作为存放同类数据的集合,给我们在程序设计时带来很多的方便,增加了灵活性。但数组也同样存在一些弊病。如数组的大小在定义时要事先规定,不能在程序中进行调整,这样一来,在程序设计中针对不同问题有时需要3 0个大小的数组,有时需要5 0个数组的大小,难于统一。我们只能够根据可能的最大需求来定义数组,常常会造成一定存储空间的浪费。我们希望构造动态的数组,随时可以调整数组的大小,以满足不同问题的需要。链表就是我们需要的动态...
链表的c语言实现(一)

链表的c语言实现(一)

链表的c语言实现(一)2007-05-03准备:动态内存分配一、为什么用动态内存分配但我们未学习链表的时候,如果要存储数量比较多的同类型或同结构的数据的时候,总是使用一个数组。比如说我们要存储一个班级学生的某科分数,总是定义一个float型(存在0.5分)数组:float score[30];但是,在使用数组的时候,总有一个问题困扰着我们:数组应该有多大?在很多的情况下,你并不能确定要使用多大的数组,比如上例,你可能并不知道该班级的学生的人数,那么你就要把...
链表的c语言实现(二)

链表的c语言实现(二)

链表的c语言实现(二)2007-05-03一、单链表的建立有了动态内存分配的基础,要实现链表就不难了。所谓链表,就是用一组任意的存储单元存储线性表元素的一种数据结构。链表又分为单链表、双向链表和循环链表等。我们先讲讲单链表。所谓单链表,是指数据接点是单向排列的。一个单链表结点,其结构类型分为两部分:1、数据域:用来存储本身数据2、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。例:typedef struct node{char nam...
链表的c语言实现(三)

链表的c语言实现(三)

链表的c语言实现(三)2007-05-03二、单链表的基本运算建立了一个单链表之后,如果要进行一些如插入、删除等操作该怎么办?所以还须掌握一些单链表的基本算法,来实现这些操作。单链表的基本运算包括:查找、插入和删除。下面我们就一一介绍这三种基本运算的算法,并结合我们建立单链表的例子写出相应的程序。1、查找对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。因为在单链表的链域中包含了后...
链表的c语言实现(四)

链表的c语言实现(四)

链表的c语言实现(四)2007-05-032、插入(后插)假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。(p->link=s;s->link=q),这样就完成了插入操作。下例是应用插入算法的一个例子:#include <stdio.h>#include <malloc.h>#...
链表的c语言实现(六)

链表的c语言实现(六)

链表的c语言实现(六)2007-05-03一、循环链表循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。循环链表的运算与单链表的运算基本一致。所不同的有以下几点:1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL。此种情况还使用于在最后一个结点后插入一个新的结点。 2、在判断是否到表尾时,是判断该结点链域的值是否...
链表的c语言实现(七)

链表的c语言实现(七)

链表的c语言实现(七)2007-05-03双向链表的基本运算:1、查找假若我们要在一个带表头的双向循环链表中查找数据域为一特定值的某个结点时,我们同样从表头结点往后依次比较各结点数据域的值,若正是该特定值,则返回指向结点的指针,否则继续往后查,直到表尾。下例就是应用双向循环链表查找算法的一个程序。#include <stdio.h>#include <malloc.h>#define N 10typedef struct node{...
链表的c语言实现(八)

链表的c语言实现(八)

链表的c语言实现(八)2007-05-032、插入对于双向循环链表,我们现在可以随意地在某已知结点p前或者p后插入一个新的结点。假若s,p,q是连续三个结点的指针,若我们要在p前插入一个新结点r,则只需把s的右链域指针指向r,r的左链域指针指向s,r的右链域指针指向p,p的左链域指针指向r即可。在p,q之间插入原理也一样。下面就是一个应用双向循环链表插入算法的例子:#include <stdio.h>#include <malloc.h&...
链表的c语言实现(九)

链表的c语言实现(九)

链表的c语言实现(九)2007-05-033、删除删除某个结点,其实就是插入某个结点的逆操作。还是对于双向循环链表,要在连续的三个结点s,p,q中删除p结点,只需把s的右链域指针指向q,q的左链域指针指向s,并收回p结点就完成了。下面就是一个应用双向循环链表删除算法的例子:#include #include #include #define N 10 typedef struct node{char name[20];struct node *llink,...
<< 31 32 33 34 35 36 37 38 39 40 >>