请选择 进入手机版 | 继续访问电脑版
快捷导航

注册后可查看大图哦

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
链表拓展讲解:
Extern
利用关键字extern,可以在一个文件中引用另一个文件中定义的变量或者函数
只有当一个变量是一个全局变量时,extern变量才会起作用extern关键字只需要指明类型和变量名就行了,不能再重新赋值,初始化需要在原文件所在处进行,如果不进行初始化的话,全局变量会被编译器自动初始化为0
在声明之后就可以使用变量名进行修改
https://www.cnblogs.com/codingmengmeng/p/7220119.html
工程编译的过程:
https://www.cnblogs.com/wuyouxiaocai/p/5701088.html    详细讲解
可重入函数和线程安全函数?
定义:可重入函数即指可以被中断的函数。重入意味着这个函数可以重复进入,可以被并行调用,可以被中断,它只使用自身栈上的数据变量,它不依赖于任务环境,在多任务调度过程中,它是安全的,不必担心数据出错。
线程安全产生的原因:大多是因为对全局变量和静态变量的操作。
可重入函数是指可进行并行调度,函数内部不使用static的数据结构,未调用malloc/free函数和标准I/O函数。使用本地数据
显式可重入函数:参数都是传值传入的,数据结构都是调用本地栈空间。
隐式可重入函数:参数是引用传递,再调用线程小心地传递非共享内存的指针,才可重入。
可重入函数与线程安全的区别与联系
联系:
函数可以是可重入的,是线程安全的,或者二者皆是,或者二者皆非。不可重入的函数不能由多个线程使用。另外,或许不可能让某个不可重入的函数是线程安全的。
区别:
(1)可重入函数是线程安全函数的一种,其特点在于它们被多个线程调用时,不会引用任何共享数据。
(2)线程安全是在多个线程情况下引发的,而可重入函数可以在只有一个线程的情况下来说。
(3)线程安全不一定是可重入的,而可重入函数则一定是线程安全的。
(4)如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。
(5)如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。
(6)线程安全函数能够使不同的线程访问同一块地址空间,而可重入函数要求不同的执行流对数据的操作互不影响使结果是相同的。
Tips
1.可重入概念只和函数访问的变量类型有关,和是否使用锁没有关系。
2.而线程安全和锁的使用关系密切,很多时候线程安全是靠锁来保证的
https://blog.csdn.net/double_happiness/article/details/72877112     详解
Char*p = NULL;(=((void *)(0)));
给指针指向一段有意义的空间为实例化;
Heap:动态内存分配,静态永久空间,需要free,生命周期和main相同
Stack:静态分配
数据结构中的堆和栈:
栈:入栈方式——先进后出
堆:常指二叉堆类比于到插树,理解树的特性,根节点和子节点。
内存分配中的堆和栈:
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的。
栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
1.回收方式不同,栈系统对其赋值与释放,生命周期和程序相同。堆如malloc,程序员对其申请空间控制释放,如不释放程序结束后任然可以对其访问,内存泄漏
2.申请后系统响应:栈只要系统剩余空间大于申请空间,即可获得申请空间大小。堆空间大小是由系统中链表进行记录,当程序员申请空间时,系统在链表中找寻第一个大小适合的空间,系统对其进行分配并在此处空间首地址中记录分配空间大小为将来进行释放正确。
堆申请后还会做一些后续工作,会影响程序效率。
3.申请空间大小:windows下栈是向低地址增长,是一块连续空间大小,规定是2MB或1MB。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
4.堆和栈中的存储内容
栈:在函数调用时,第一个进栈的是主函数中函数调用后的下一条指令(函数调用语句的下一条可执行语句)的地址,然后是函数的各个参数,在大多数的C编译器中,参数是由右往左入栈的,然后是函数中的局部变量。注意静态变量是不入栈的。
    当本次函数调用结束后,局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址,也就是主函数中的下一条指令,程序由该点继续运行。
堆:一般是在堆的头部用一个字节存放堆的大小。堆中的具体内容有程序员安排。
正文段:
正文段(指令集)(text):存放被执行的机器指令。这个段是只读的(所以,在这里不能写自己能修改的代码),它允许系统中正在运行的两个或多个进程之间能够共享这一代码。例如,有几个用户都在使用文本编辑器,在内存中仅需要该程序指令的一个副本,他们全都共享这一副本。
https://www.cnblogs.com/luckygxf/p/4800196.html       进程和程序
Static四种用法:        面试题。。。。。。
Static可修饰函数和变量,函数本身是全局的,变量作用域决定了static修饰时的生存周期。
Extern:仅可修饰全局变量,在使用时只需注意变量类型和名称。
对全局变量加static,定义为静态存储方式,并不意味着是静态存储;而不加static,是动态存储。两种形式的全局变量(外部变量)都是静态存储方式,都是编译时分配存储空间,但作用域不同。使用静态外部变量,有利于隔离错误,有利于模块化程序设计。
https://www.cnblogs.com/yezhenhan/archive/2011/10/31/2229724.html         static的用法详细
总结:变量的作用域和类型决定了程序的执行,静态变量和全局变量影响着线程安全,同理可重入函数。堆和栈是程序存放变量的位置,以不同的类型来决定存放。只考虑c大小和指针的结合来操作c语言但在编程时需考虑作用域问题。程序本身并不难,难在没有思路。。。

Connecting & Messaging from Any.

共 1 个关于本帖的回复 最后回复于 2018-9-10 17:22

@TK 注册会员 发表于 2018-9-10 17:22:45 | 显示全部楼层
201809101721
Connecting & Messaging from Any.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

推荐板块

精彩推荐

热门排行

明星用户

手机版|小黑屋|AnyMSG ( ©AnyMSG 2009 - 2017 · ICP备16009991号 )

GMT+8, 2018-9-19 22:28