
C语言
文章平均质量分 70
xueda120
程序员
展开
-
C语言如何产生随机数
1.基本函数 在C语言中取随机数所需要的函数是:int rand(void);void srand(unsigned int n); rand()函数和srand()函数被声明在头文件stdlib.h中,所以要使用这两个函数必须包含该头文件:#include 2.使用方法 rand()函数返回0到RAND_MAX之间的伪随机数(pseudoran原创 2013-08-02 17:22:29 · 1871 阅读 · 0 评论 -
C语言内存对齐详解(3)
接上一篇:C语言内存对齐详解(2)在minix的stdarg.h文件中,定义了如下一个宏:/* Amount of space required in an argument list for an arg of type TYPE. * TYPE may alternatively be an expression whose type is used. */#def...2013-11-11 15:01:15 · 116 阅读 · 0 评论 -
C语言中do...while(0)的妙用
在linux内核代码中,经常看到do...while(0)的宏,do...while(0)有很多作用,下面举出几个:1、避免goto语句:通常,如果一个函数开始要分配一些资源,然后如果在中途遇到错误则要退出函数,当然,退出前要释放资源,我们的代码可能如下: #defien N 10bool Execute(){ // 分配资源 int *p = (int...原创 2013-11-13 08:14:00 · 157 阅读 · 0 评论 -
C语言中可变参数函数实现原理
C函数调用的栈结构 可变参数函数的实现与函数调用的栈结构密切相关,正常情况下C的函数参数入栈规则为__stdcall, 它是从右到左的,即函数中的最右边的参数最先入栈。例如,对于函数: void fun(int a, int b, int c) { int d; ... } 其栈结构为 0x1ffc-->d...原创 2013-11-13 10:42:22 · 112 阅读 · 0 评论 -
stdarg.h头文件源代码分析
谈到C语言中可变参数函数的实现(参见C语言中可变参数函数实现原理),有一个头文件不得不谈,那就是stdarg.h本文从minix源码中的stdarg.h头文件入手进行分析:#ifndef _STDARG_H#define _STDARG_H#ifdef __GNUC__/* The GNU C-compiler uses its own, but similar v...2013-11-13 15:59:25 · 192 阅读 · 0 评论 -
C语言中scanf函数的实现
接上一篇C语言中可变参数函数实现原理,从理论上详细介绍了C语言中可变参数函数的实现,这一篇从minix内核源码中的scanf函数入手,学习C语言经典可变参数函数的实现过程在scanf.c文件中,可以看到scanf函数,代码如下:#include <stdio.h>#include <stdarg.h>#include "loc_incl...2013-11-13 16:06:11 · 772 阅读 · 1 评论 -
C语言中void*详解及应用(1)
void的含义:void的字面意思是“无类型”,void *则为“无类型指针”,void *可以指向任何类型的数据。void几乎只有“注释”和限制程序的作用,因为从来没有人会定义一个void变量,让我们试着来定义:void a;这行语句编译时会出错,提示“illegal use of type 'void'”。即使void a的编译不会出错,它也没有任何实际意义。 众...原创 2013-11-14 00:45:43 · 513 阅读 · 0 评论 -
C语言函数指针总结(1)
函数在内存中有一个物理位置,而这个位置是可以赋给一个指针的。函数的地址就是该函数的入口点。因此,函数指针可被用来调用一个函数。函数的地址是用不带任何括号或参数的函数名来得到的。(这很类似于数组地址的得到方法,即,在只有数组名而无下标是就得到数组地址。)1、怎样说明一个函数指针变量呢? 为了说明一个变量fn_pointer的类型是"返回值为int的函数指针",你可以使用下面的说...原创 2013-11-15 01:55:48 · 133 阅读 · 0 评论 -
C语言函数指针总结(2)--- 回调函数
接上一篇:C语言函数指针总结(1)程序员常常需要实现回调。本文将讨论函数指针的基本原则并说明如何使用函数指针实现回调。注意这里针对的是普通的函数。 回调函数是一个程序员不能显式调用的函数,通过将回调函数的地址传给调用者从而实现调用。要实现回调,必须首先定义函数指针。尽管定义的语法有点不可思议,但如果你熟悉函数声明的一般方法,便会发现函数指针的声明与函数声明非常类似。 回调函数使用有时候是...2013-11-16 00:47:51 · 267 阅读 · 0 评论 -
C语言qsort用法
一、对int类型数组排序[code="c"]int num[100];Sample:int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);[/code]二、对char类型数组排序(同int类型)[cod...原创 2013-10-10 09:15:46 · 169 阅读 · 4 评论 -
C语言函数指针的用法
函数指针是一种在C、C++、D语言、其他类 C 语言和Fortran 2003中的指针。函数指针可以像一般函数一样,用于调用函数、传递参数。在如 C 这样的语言中,通过提供一个简单的选取、执行函数的方法,函数指针可以简化代码。函数指针只能指向具有特定特征的函数。因而所有被同一指针运用的函数必须具有相同的参数和返回类型。下面的代码说明了一种初始化函数指针的方法:int f(in...2014-04-24 11:06:42 · 285 阅读 · 0 评论 -
C语言内存对齐详解(2)
接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。VC 中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式;...2013-11-11 14:43:55 · 106 阅读 · 0 评论 -
C语言内存对齐详解(1)
一、什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的...原创 2013-11-10 14:16:54 · 114 阅读 · 0 评论 -
数组的顺序表示和实现
// c5-1.h 数组的顺序存储结构。 #define MAX_ARRAY_DIM 8 // 假设数组维数的最大值为8 struct Array { ElemType *base; // 数组元素基址,由InitArray分配 int dim; // 数组维数 int *bounds; // 数组维界基址,由InitArray分配 int *constants原创 2013-07-08 22:22:40 · 952 阅读 · 0 评论 -
C语言中带参数的宏
带参数的宏定义有如下的格式:【#define 指令----带参数的宏】 #define 标识符(x1,x2,……,xn)其中 x1,x2,……xn是标志符(宏的参数)注意:在宏的名字和括号之间必修没有空格。如果有空格,预处理会认为是在定义一个简单的宏,其中(x1,x2,……,xn)是替换列表的一部分当预处理器遇到一个带参数的宏,会将定义存储起来以便以后使用。在后面的程序中,如原创 2013-07-11 23:09:53 · 769 阅读 · 0 评论 -
__FILE__,__LINE__,FUNCTION__实现代码跟踪调试
我们在写程序的时候,总是或多或少会加入一些printf之类的语句用于输出调试信息,但是printf语句有个很不方便的地方就是当我们需要发布程序的时候要一条一条的把这些语句删除,而一旦需要再次调试的时候,这些语句又不得不一条条的加上,这给我们带来了很大的不便,浪费了我们很多的时间,也造成了调试的效率低下。所以,很多人会选择使用宏定义的方式来输出调试语句。比如,定义一个宏开关:#define原创 2013-07-08 22:25:10 · 556 阅读 · 0 评论 -
calloc(), malloc(), realloc(), free(),alloca()
内存区域可以分为栈、堆、静态存储区和常量存储区,局部变量,函数形参,临时变量都是在栈上获得内存的,它们获取的方式都是由编译器自动执行的。利用指针,我们可以像汇编语言一样处理内存地址,C 标准函数库提供了许多函数来实现对堆上内存管理,其中包括:malloc函数,free函数,calloc函数和realloc函数。使用这些函数需要包含头文件stdlib.h。 四个函数之间的有区别,也有联系,原创 2013-09-25 20:32:28 · 730 阅读 · 0 评论 -
快排序(递归算法)
#include#include#define N 10void quicksort(int a[],int low,int high);int split(int a[],int low,int high);main(){ int a[N],i; printf("Enter %d numbers to be sorted: ",N); for(i=0;i原创 2013-07-08 22:21:47 · 548 阅读 · 0 评论 -
C语言assert()函数用法总结
assert宏的原型定义在中,其作用是如果它的条件返回错误,则终止程序执行,原型定义:#include void assert( int expression );assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。请看下面的程序清单badptr.c:#in原创 2013-10-04 23:58:52 · 773 阅读 · 0 评论 -
C语言递归练习
1、炮弹一样的球状物体,能够堆积成一个金字塔,在顶端有一个炮弹,它坐落在一个4个炮弹组成的层面上,而这4个炮弹又坐落在一个9个炮弹组成的层面上,以此类推。写一个递归函数CannonBall,这个函数把金字塔的高度作为参数,并且返回它所包括的炮弹数量。函数必须按照递归方式实现,不可以使用迭代结构,例如while或for。int CannonBall(int h){ if(h == 1) re原创 2013-10-02 16:44:15 · 1324 阅读 · 0 评论 -
C语言qsort用法
一、对int类型数组排序int num[100];Sample:int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);二、对char类型数组排序(同int类型)char word[100];Sample原创 2013-08-20 00:26:49 · 951 阅读 · 0 评论 -
C语言中的异常处理
在C语言中异常处理一般有这么几种方式:1.使用标准C库提供了abort()和exit()两个函数,它们可以强行终止程序的运行,其声明处于头文件中。2.使用assert(断言)宏调用,位于头文件中,当程序出错时,就会引发一个abort()。3.使用errno全局变量,由C运行时库函数提供,位于头文件中。4.使用goto语句,当出错时跳转。5.使用setjmp,longjmp进行异原创 2013-07-08 22:25:18 · 1264 阅读 · 0 评论 -
C语言退出多层嵌套循环技巧
由于break语句只能影响它的最内层循环,要想立即从深层嵌套循环中退出,有哪些方法呢?1、使用goto语句:while(condition1) { while(condition2) { while(condition3) { if(some disaster) goto quit; ...2014-04-24 11:33:44 · 3995 阅读 · 0 评论