宏定义和全局变量的区别
- 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
- 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
- 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不支持extern。
- 宏定义的只是一段字符,在编译的时候被替换到引用的位置。在运行中是没有宏定义的概念的(不占用内存)。而变量在运行时要为其分配内存。
回调函数
- 通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。
- 回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。
- 回调方法是任何一个被该回调方法为其第一个参数 的 其它方法 调用 的方法。很多时候,回调是一个当某些事件发生时被调用的方法。
函数递归调用
func1
{
func1();
}
可/不可重入函数
1.定义可重入函数,函数内不能含有全局变量及static变量,不能使用malloc、free
2.信号捕捉函数应设计为可重入函数
3.信号处理程序可以调用的可重入函数可参阅 man 7 signal
4.没有包含在上述列表中的函数大多是不可重入的,其原因为:
a)使用静态数据结构
b)调用了malloc或free
c)是标准I/o函数
- 查看可重入函数:man 7 signal
- 栈帧:存放局部变量和临时值
- 函数中的return作用:返回到调用者那里去
- exit(1):退出整个进程
- pthread_exit():退出单个线程
- 关键字restrict:所有对这个指针指向内存的操作只能通过本指针完成
bss,data,text,heap,stack
- 一个程序本质上都是由 bss(Block started by symbol)段、数据段data、代码段text三个组成的。
- 代码段主要保存程序,执行代码通常是只读的。如果程序创建了多个进程,则各个进程可以共享代码段。
- 数据段保存已经初始化的全局变量静态变量。
- BSS段保存为初始化的全局变量,静态变量。并在程序开始执行之前被内核初始化为0或NULL
- 进程在内存中的映象主要分为:代码段text,数据段data,BSS段,堆heap,栈stack。
- 堆:动态分配的内存区域大小不固定。C语言中可以使用malloc函数。和free函数进行动态内存分配和释放。
- 栈用来保存函数临时创建的局部变量(不包括函数内部的static变量)。
- 堆空间是需要手动申请和释放的,而栈的空间是系统自动分配和释放的。
- 函数被调用时,函数参数也会被压入发起调用函数的进程栈中,等调用结束后,函数的返回值会被保存到栈中。
void *memset(void *s, int ch, size_t n);
- 函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
- memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法 [1] 。
- memset()函数原型是extern void *memset(void *buffer, int c, int count)
- buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度。