![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C
buaa_shang
这个作者很懒,什么都没留下…
展开
-
printf函数遵守C调用规范,即参数 从右至左 压栈,堆栈由调用者平衡
printf函数遵守C调用规范,即参数从右至左 压栈,堆栈由调用者平衡。(这种从右至左的方式不会随着编译器,机器的不同而不同) )。[code]printf("%d,%d", i, i++ ); 产生的汇编码大致像下面这样:mov eax,dword ptr [i] push eax转载 2014-04-08 09:24:39 · 1142 阅读 · 1 评论 -
使用inotify进行文件事件通知
#include #include #include #define MAX_EVENTS 256#define BUFFER_SIZE (MAX_EVENTS * sizeof(struct inotify_event))int register_watchpoint(int fd, char *dir);int watch(int fd);void emit_event(s原创 2013-04-25 21:39:00 · 957 阅读 · 0 评论 -
IPC机制---共享内存编程
#include #include #include #include #include #include #include "common.h"#define MAX_STRING 5000typedef struct { int semID; int counter; char string[MAX_STRING+1];} MY_BLOCK_T;原创 2013-04-25 15:47:19 · 858 阅读 · 0 评论 -
宏与内联函数的区别
第一部分:宏为什么要使用宏呢?因为函数的调用必须要将程序执行的顺序转移到函数所存放在内存中的某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去执行前要保存现场并记忆执行的地址,转回后要恢复现场,并按原来保存地址继续执行。因此,函数调用要有一定的时间和空间方面的开销,于是将影响其效率。而宏只是在预处理的地方把代码展开,不需要额外的空间和时间方面的开转载 2013-04-14 09:51:06 · 864 阅读 · 0 评论 -
C中为什么要用内联函数
inline 这个名称可以反映出它的工作方式,函数会在它所调用的位置上展开.这么做可以消除函数调用和返回所带来的开销(寄存器存储和恢复),而且,编译器会把调用函数的代码和函数本身放在一起进行优化,所以有进一步优化代码的可能.不过这么做是有代价的,代码会变长,这也就意味着占用更多的内存空间或者占用更多的指令缓存.内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数.原创 2012-12-09 09:40:52 · 2040 阅读 · 0 评论 -
利用比特操作知道你机器的字长
#include #include int wordlength(void);int main(){ printf("%d\n", wordlength()); return 0;}int wordlength(void){ int i; unsigned v = (unsigned) ~0; f原创 2012-11-25 15:29:48 · 570 阅读 · 0 评论 -
C中system()函数使用的小例子
#include #include int main(){ printf("THE DIRECTORY NOW:\n"); system("pwd"); printf("The date\n"); system("date"); return 0;}输出为:THE DIRECTORY NOW:/原创 2012-11-24 15:02:48 · 861 阅读 · 0 评论 -
指针数组与二維数组的区别
下面有两个定义:int a[10][20];int *b[10];其中a是一个真正的二維数组,它分配了200个int类型的存储空间,并且通过常规的矩阵下标运算可以得到矩阵元素,对于b来说,该定义仅仅分配了10个指针,并且没有对它们初始化,它们的初始化必须以显示的方式进行,比如静态初始化或通过代码初始化.假定b的每个元素都指向一个具有20个元素的数组,那么编译器就要为它分配200个i原创 2012-12-06 13:15:19 · 1081 阅读 · 0 评论 -
C的指针数组
声明: char *lineptr[MAXLINES]它表示lineptr是一个具有MAXLINES个元素的一維数组,其中数组的每一个元素是一个指向字符类型对象的指针,也就是说,lineptr[i]是一个字符指针,而*lineptr[i]是该指针指向的第i个文本行的首字符.例:指针数组的初始化(摘自C程序设计)编写一个函数month_name(n),它返回一个指向第n个原创 2012-12-04 23:37:28 · 729 阅读 · 0 评论 -
C中violatile的用法
1.violate影响编译器结果的输出,violate变量随时可能发生变化,与violate有关的运算不要进行编译优化,以免出错.例如:volatile int i=10;int j = i;...int k = i; violate告诉编译器变量i是随时可能发生变化的,每次使用i必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中.而优化的做法是,由于编译原创 2012-11-20 15:35:26 · 3971 阅读 · 0 评论 -
编译简介
平台:linux编译器:GCC源文件:hello.c到底GCC在将源文件编程可执行文件的时候做了什么工作呢,首先你得指导GCC的常用命令吧,GCC在工作的步骤为:1. 预编译 命令: gcc -E hello.c -o hello.i 或者 cpp hello.c > hello.i 然后你就可以gedit hello.i来打开它。好好比转载 2013-04-21 23:10:00 · 648 阅读 · 0 评论 -
用栈计算逆波兰式
#include #include #include typedef struct Mystack *Stack;struct Mystack { int Capacity; /* 栈的容量 */ int Top_of_stack; /* 栈顶下标 */ int *Array; /* 存放栈中元素的数组 */};/* 栈的创建 */原创 2013-06-18 00:50:47 · 2899 阅读 · 1 评论 -
C语言中的-------结构
struct point { int x; int y;};1.关键字struct引入结构声明。struct后面的名字是可选的,称为结构标记(这里为point).结构标记用于为结构命名,在定义之后,结构标记就代表花括号内的声明,可以用它作为该声明的简写形式。结构体中的变量称为结构成员。struct声明定义了一种数据类型。在标志结构成员表结束的右话括号之后可以跟一原创 2013-06-17 14:07:28 · 1259 阅读 · 0 评论 -
树和二叉查找树的实现
树的声明。和二叉查找树的实现原创 2013-08-19 17:06:08 · 891 阅读 · 0 评论 -
C的xml编程文章链接
官方地址:http://www.xmlsoft.org/http://hi.baidu.com/singyea/item/ed4d1c335a9527b8633aff82http://os.chinaunix.net/a2007/1213/977/000000977010.shtmlhttp://blog.chinaunix.net/uid-25885064-id-3141923.ht原创 2013-07-09 10:41:21 · 825 阅读 · 0 评论 -
指针相关。。
2.13 以下的初始化有什么区别?char a[] ="stringliteral"; char *p = "stringliteral"; 当我向 p[i] 赋值的时候, 我的程序崩溃了。字符串常量有两种稍有区别的用法。用作数组初始值 (如同在 char a[] 的声明中), 它指明该数组中字符的初始值。其它情况下, 它会转化为一个无名的静态字符数组, 可能会存储在只读内存中, 这就是造原创 2013-06-19 16:28:29 · 741 阅读 · 0 评论 -
求最长子序列和
法一:O(n^3)#include #include int sub_Sum(int a[], int left, int right){ int i, temp_sum = 0; for(i = left; i <= right; i++) { temp_sum += a[i]; } return temp_sum;}in原创 2013-06-09 00:58:31 · 4884 阅读 · 3 评论 -
C语言声明一维动态数组
#include #include int main(){ int i, n; printf("Please input a integer n:"); scanf("%d", &n); int *a = (int *)malloc(n * sizeof(int)); for(i = 0; i {原创 2013-06-09 00:20:39 · 3842 阅读 · 0 评论 -
表达式树
用到了栈,并且递归实现了中序遍历,后序遍历,前序遍历。同时应该学会union的使用方法。基础知识:一、表达式树 表达式树的树叶是操作数(operand),加常数或变量名字,而其他的结点为操作数(operator)。由于这里所有的操作都是二元的,因此这棵特定的树正好是二叉树,虽然这是最简单的情况,但是结点还是有可能含有多于两个的儿子,这里我们不讨原创 2013-06-18 21:30:45 · 19585 阅读 · 5 评论 -
利用数组栈将中缀表达式转换成后缀表达式
#include #include #include typedef struct Mystack *Stack;struct Mystack { int Capacity; /* 栈的容量 */ int Top_of_stack; /* 栈顶下标 */ char *Array; /* 存放栈中元素的数组 */};/* 栈的创原创 2013-06-18 11:15:09 · 1928 阅读 · 0 评论 -
栈的应用---平衡符号
判断一行字符串输入"各种括号"是否是合法的-----------------------栈用数组实现如:[()]是合法的(balance)[(])是不合法的(imbalance)#include #include #include typedef struct Mystack *Stack;struct Mystack { int Capacity;原创 2013-06-17 23:23:59 · 3800 阅读 · 2 评论 -
static函数的作用
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。(1)先来介绍它的第一条也是最重要的一条:隐藏。当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。下面是a.c的内容char a = 'A'; // global variablev转载 2012-11-20 14:44:46 · 1416 阅读 · 0 评论 -
A Tip
if(!valid)等价于if(valid == 0)如果不是有效的原创 2012-11-11 10:21:31 · 481 阅读 · 0 评论 -
一个将十六进制转换成十进制的小例子
#include #include #include #include int main(){ int i, j, len, sum = 0; char s[1000]; //store the 0x number you input printf("Please input the nu原创 2012-11-11 13:52:21 · 1711 阅读 · 0 评论 -
waitpid()函数
表头文件 #includesys/types.h> #include 定义函数 pid_t waitpid(pid_t pid,int * status,int options);函数说明 waitpid()会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用 waitpid()时子进程已经结束,则 waitpid()会立即返回子进程结束状原创 2012-11-25 19:52:19 · 579 阅读 · 0 评论 -
C中确定整型的范围
#include int main(){ printf("signed int min = %d\n", -(int)((unsigned int) ~0 >> 1)); printf("signed int max = %d\n", (int)((unsigned int) ~0 >> 1));}(1)先把数字0的各个二进制位全部转换成1~0原创 2012-11-10 22:30:51 · 997 阅读 · 0 评论 -
C中访问文件的基本操作
1.在读写一个文件之前,必须通过库函数fopen打开该文件.fopen用外部文件名与操作系统进行某些必要的连接和通信,并返回一个随后可以用于文件读写操作的指针.声明一个文件指针fp:FILE *fp;FILE *fopen(char *name, char *mode);注:FILE像int一样是一个类型名,而不是结构标记.name是文件名,mode为访问模式,包括:读("r"原创 2012-11-10 17:31:38 · 1153 阅读 · 0 评论 -
main函数参数要注意的地方
int main(int argc, char *argv[])也可以写成 int main(int argc, char **argv)其中argc为参数个数+1,argv[]是一个数组如下:如有一个可执行文件a.我们执行它的形式为: ./a t1 t2 t3那么argc = 4, argv[0] = ./a, argv[1] = t1, argv[2] = t2, a原创 2012-11-10 15:22:31 · 433 阅读 · 0 评论 -
getchar()与putchar()的简单使用
先看一个小例子(ctrl+z终止):#include int main(){ int c; c = getchar(); while(c != EOF) { putchar(c); c = getchar(); }原创 2012-11-10 11:33:43 · 7042 阅读 · 1 评论 -
strdup()函数的用法
函数原型:extern char *strdup(char *str)参数说明:str待复制的字符串。 所在库名:#include 函数功能:实现复制字符串str。 返回说明:返回复制的新字符串的指针,复制失败返回NULL。例子:#include #include int main(){ char *s = "I come原创 2012-11-27 22:21:45 · 959 阅读 · 0 评论 -
使用mtrace()函数检内存溢出
对于内存溢出之类的麻烦可能大家在编写指针比较多的复杂的程序的时候就会遇到。Linux系统下有一个工具可以帮忙调试,这就是mtrace。mtrace主要能够检测一些内存分配和泄漏的失败等。下面我们来学习一下它的用法(man mtrace)1.在需要跟踪的程序中需要包含头文件,而且在main()函数的最开始包含一个函数调用mtrace()。由于在 main函数的最开头调用了mtrace(),所以该原创 2012-11-27 20:26:29 · 2402 阅读 · 1 评论 -
getopt()函数的使用方法
1.头文件: #include 2.函数原型: int getopt(int argc, char * const argv[], const char *optstring);extern char *optarg; //如果选项接受参数的话,那么optarg就是选项的参数指针extern int optind, //下一次调用getopt的时,从optind存储的位置处重原创 2012-11-27 22:55:57 · 673 阅读 · 0 评论 -
C中有效的指针运算
有效的指针运算包括四种1.相同类型指针之间的赋值运算2.指针同整数之间的加法或减法运算3.指向相同数组中元素的两个指针之间的减法或比较运算4.将指针赋值为0或指针与0之间的比较运算tips:1.指针是一个变量,但数组名不是一个变量,类似a=pa和a++形式的句子都是非法的.2.指针和整数之间不能相互转换,但0是唯一的例外:常量0可以赋值给指针,指针也可以原创 2012-11-15 15:48:37 · 844 阅读 · 0 评论 -
C中关于sin(),cos(),pow()函数使用的一个问题
#include #include int main(){ double x = 3.1415926 / 2; double tmp = sin(x); printf("result = %g\n", tmp); double a = 2, b = 1; tmp = pow(a, b); p原创 2012-11-24 21:16:43 · 1218 阅读 · 0 评论 -
C中的stat()函数
需要的头文件:#include #include 函数定义:int stat(const char * file_name, struct stat *buf);函数说明:用于将参数file_name所指的文件状态复制到参数buf所指的结构中.原创 2012-11-16 18:38:53 · 1882 阅读 · 0 评论 -
C中的strncat()函数
函数原型:extern char *strncat(char *dest,char *src,int n)参数说明:src为源字符串,dest为目的字符串,n为指定的src中的前n个字符。 所在库名:#include 函数功能:把src所指字符串的前n个字符添加到dest结尾处,覆盖dest结尾处的'/0',实现字符串连接。 返回说明:返回指针,连接原创 2012-11-16 19:16:53 · 797 阅读 · 0 评论 -
C中getenv()函数
函数名: getenv功 能: 从环境中取字符串,获取环境变量的值 头文件: stdlib.h 用 法:char *getenv(char *envar); 函数说明:getenv()用来取得参数envar环境变量的内容。参数envar为环境变量的名称,如果该变量存在则会返回指向该内容的指针。返回值: 执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回N原创 2012-11-16 09:47:48 · 2381 阅读 · 0 评论 -
C中strtok()函数和strtok_r()函数
1.函数名:strtok功能:查找由第二个串指定的分界符分开的单词用法:char *strtok(char *str1, char *str2)一个例子:#include #include #include int main(){ char input[16] = "abc,d"; char *p;原创 2012-11-16 12:10:29 · 16215 阅读 · 1 评论 -
C中指针使用
1.char amessage[] = "now is the time"; /*定义一个数组*/char *pmessage = "now is the time"; /*定义一个指针*/二者有很大的区别:amessage是一个仅仅足以存放初使化字符串数组以及空字符'\0'的一維数组.数组中的单个字符可以进行修改原创 2012-11-15 16:18:18 · 703 阅读 · 0 评论 -
C中union的用法
在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也可以使用联合体来发挥其长处。首先看一段代码:union myun{struct { int x; int y; int z; }u;int k;}a;int main(){a.u.x =4;a.u.y原创 2012-11-14 15:34:30 · 924 阅读 · 0 评论