c语言笔记

41 篇文章 0 订阅

宏定义和全局变量的区别

  • 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以。
  • 宏定义不可以被赋值,即其值一旦定义不可修改,而变量在运行过程中可以被修改。
  • 宏定义只有在定义所在文件,或引用所在文件的其它文件中使用。 而全局变量可以在工程所有文件中使用,只要再使用前加一个声明就可以了。换句话说,宏定义不支持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的长度。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值