c语言,请问为什么子函数中数组malloc会被free掉,但是结构体不会?

《c语言free用法》由会员分享,可在线阅读,更多相关《c语言free用法(8页珍藏版)》请在人人文库网上搜索。

1、c语言free用法c语言中free的用法如何工作c语言中free的用法如何工作c语言中free的用法:malloc()和free()1、函数原型及说明:void*malloc(longNumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。关于分配失败的原因,应该有多种,比如说空间不足就是一种。voidfree(void*FirstByte):该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。2、函数的用法:其实这两个函数用起来倒不是很难,也就是malloc()之后觉得用

2、够了就甩了它把它给free()了,举个简单例子:程序代码:/Code.char*Ptr=NULL;Ptr=(char*)malloc(100*sizeof(char);if(NULL=Ptr)exit(1);gets(Ptr);/code.free(Ptr);Ptr=NULL;/code.就是这样!当然,具体情况要具体分析以及具体解决。比如说,你定义了一个指针,在一个函数里申请了一块内存然后通过函数返回传递给这个指针,那么也许释放这块内存这项工作就应该留给其他函数了。3、关于函数使用需要注意的一些地方:A、申请了内存空间后,必须检查是否分配成功。B、当不需要再使用申请的内存时,记得释放;释放后

3、应该把指向这块内存的指针指向NULL,防止程序后面不小心使用了它。C、这两个函数应该是配对。如果申请后不释放就是内存泄露;如果无故释放那就是什么也没有做。释放只能一次,如果释放两次及两次以上会出现错误(释放空指针例外,释放空指针其实也等于啥也没做,所以释放空指针释放多少次都没有问题)。D、虽然malloc()函数的类型是(void*),任何类型的指针都可以转换成(void*),但是最好还是在前面进行强制类型转换,因为这样可以躲过一些编译器的检查。好了!最基础的东西大概这么说!现在进入第二部分:c语言中free的用法:malloc()到底从哪里得来了内存空间1、malloc()到底从哪里得到了内

4、存空间?答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。操作系统中有一个记录空闲内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。就是这样!说到这里,不得不另外插入一个小话题,相信大家也知道是什么话题了。什么是堆?说到堆,又忍不住说到了栈!什么是栈?下面就另外开个小部分专门而又简单地说一下这个题外话:2、什么是堆:堆是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可

5、以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。什么是栈:栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈,就是切换SS/ES啮存器。栈空间不需要在高级语言里面显式的分配和释放。以上的概念描述是标准的描述,不过有个别语句被我删除,不知道因为这样而变得不标准了八八通过上面对概念的描述,可以知道:栈是由编译器自动分配释放,存放函数的参数值、局部变量的值等。操作方式类似于数据结构中的栈。堆一般由程序员分配释放,若不释放,程序结束时可能由OS回收

6、。注意这里说是可能,并非一定。所以我想再强调一次,记得要释放!注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。(这点我上面稍微提过)值得关注,windows会用到系统的堆吗。所以,举个例子,如果你在函数上面定义了一个指针变量,然后在这个函数里申请了一块内存让指针指向它。实际上,这个指针的地址是在栈上,但是它所指向的内容却是在堆上面的!这一点要注意!所以,再想想,在一个函数里申请了空间后,比如说下面这个函数:程序代码:/code.voidFunction(void)char*p=(char*)malloc(100*sizeof(char);就这个例子,千万不要认为函数返回,函数所在的栈被

7、销毁指针也跟着销毁,申请的内存也就一样跟着销毁了!这绝对是错误的!因为申请的内存在堆上,而函数所在的栈被销毁跟堆完全没有啥关系。所以,还是那句话:记得释放!3、free()到底释放了什么这个问题比较简单,其实我是想和第二大部分的题目相呼应而已!哈哈!free()释放的是指针指向的内存!注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,前面我已经说过了,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。非常重要啊这一点!好了!这个“

8、题外话”终于说完了。就这么简单说一次,知道个大概就可以了!下面就进入第三个部分:c语言中free的用法:malloc()以及free()的机制这个部分我今天才有了新的认识!而且是转折性的认识!所以,这部分可能会有更多一些认识上的错误!不对的地方请大家帮忙指出!事实上,仔细看一下free()的函数原型,也许也会发现似乎很神奇,free()函数非常简单,只有一个参数,只要把指向申请空间的指针传递给free()中的参数就可以完成释放工作!这里要追踪到malloc()的申请问题了。申请的时候实际上占用的内存要比申请的大。因为超出的空间是用来记录对这块内存的管理信息。先看一下在UNIX环境高级编程中第七

9、章的一段话:大多数实现所分配的存储空间比所要求的要稍大一些,额外的空间用来记录管理信息分配块的长度,指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端,则会改写后一块的管理信息。这种类型的错误是灾难性的,但是因为这种错误不会很快就暴露出来,所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。以上这段话已经给了我们一些信息了。malloc()申请的空间实际我觉得就是分了两个不同性质的空间。一个就是用来记录管理信息的空间,另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中,用结构体来记录同一个对象的不同信息是天经地义的事!下面看看这个结构体

}

秋招进行中,搜罗了一些面试题,看看你会不会?

1、说一下static关键字的作用

2、说一下C++和C的区别

3、说一说c++中四种cast转换

5、给定三角形ABC和一点P(x,y,z),判断点P是否在ABC内,给出思路并手写代码

6、怎么判断一个数是二的倍数,怎么求一个数中有几个1,说一下你的思路并手写代码 7、请你说一下你理解的c++中的smart pointer四个智能指针:

9、请你回答一下野指针是什么?

10、请你介绍一下C++中的智能指针

11、请你回答一下智能指针有没有内存泄露的情况

12、请你来说一下智能指针的内存泄漏如何解决

13、请你回答一下为什么析构函数必须是虚函数?为什么C++默认的析构函数不是虚函数

16、请你来说一下C++中析构函数的作用

17、请你来说一下静态函数和虚函数的区别

18、请你来说一说重载和覆盖

20、请你说一说你理解的虚函数和多态

23、请你来写个函数在main函数执行前先运行

34、请你来说一下C++里是怎么定义常量的?常量存放在内存的哪个位置?

26、请你来说一说隐式类型转换

27、说说你了解的类型转换

28、请你来说一说C++函数栈空间的最大值

31、请你说说虚函数表具体是怎样实现运行时多态的?

32、请你说说C语言是怎么进行函数调用的?

34、请你说说C++如何处理返回值?

35、请你回答一下C++中拷贝赋值函数的形参能否进行值传递?

38、请你回答一下静态函数和虚函数的区别

1、请你来说一下map和set有什么区别,分别又是怎么实现的

3、请你来说一说STL迭代器删除元素

4、请你说一说STL中MAP数据存放形式

6、请你说一说vector和list的区别,应用,越详细越好

7、请你来说一下STL中迭代器的作用,有指针为何还要迭代器

8、请你说一说epoll原理

9、请你说一说STL中MAP数据存放形式

10、n个整数的无序数组,找到每个元素后面比它大的第一个数,要求时间复杂度为O(N)

1.请你来说一下C++中类成员的访问权限

3、请你回答一下C++类内可以定义引用数据成员吗?

1、请你回答一下什么是右值引用,跟左值又有什么区别?

2、析构函数可以为 virtual 型,构造函数则不能,为什么?

3、C++中空类默认产生哪些类成员函数?

2、 请你来回答一下include头文件的顺序以及双引号””和尖括号的区别?

3、 请你回答一下malloc的原理,另外brk系统调用和mmap系统调用的作用分别是什么?

4、 请你说一说C++的内存管理是怎样的?

5、请你来说一下C++/C的内存分配

6、请你回答一下**如何判断内存泄漏?

7、请你来说一下什么时候会发生段错误

8、请你来回答一下什么是内存泄漏

9、请你来回答一下new和malloc的区别

10、请你来说一下共享内存相关api

11、请你来说一下reactor模型组成

12、请自己设计一下如何采用单线程的方式处理高并发

13、请你说说C++如何处理内存泄漏?

14、请你说说select,epoll的区别,原理,性能,限制都说一说

15、请你说一说C++ STL 的内存优化

1、请问C++11有哪些新特性?

2、请你详细介绍一下C++11中的可变参数模板、右值引用这几个新特性。

2、请你说一说Linux虚拟地址空间

3、请你说一说操作系统中的程序的内存结构

4、请你说一说操作系统中的缺页中断

5、请你回答一下fork和vfork的区别

6、请问如何修改文件最大句柄数?

8、请问MySQL的端口号是多少,如何修改这个端口号

9、请你说一说操作系统中的页表寻址

10、请你说一说有了进程,为什么还要有线程?

11、请问单核机器上写多线程程序,是否需要考虑加锁,为什么?

12、请问线程需要保存哪些上下文,SP、PC、EAX这些寄存器是干嘛用的

13、请你说一说线程间的同步方式,最好说出具体的系统调用

14、游戏服务器应该为每个用户开辟一个线程还是一个进程,为什么?

15、请你说一说OS缺页置换算法

16、请你说一下多进程和多线程的使用场景

17、请你说一说死锁发生的条件以及如何解决死锁

18、请问虚拟内存和物理内存怎么对应

19、请你说一说操作系统中的结构体对齐,字节对齐

23、请你说一下虚拟内存置换的方式

24、请你说一下多线程,线程同步的几种方式

25、请你讲述一下互斥锁(mutex)机制,以及互斥锁和读写锁的区别

26、请你说一说进程状态转换图,动态就绪,静态就绪,动态阻塞,静态阻塞

28、给你一个类,里面有static,virtual,之类的,来说一说这个类的内存分布

29、请你回答一下软链接和硬链接区别

32、请你说一说用户态和内核态区别

33、请问如何设计server,使得能够接收多个客户端的请求

34、死循环+来连接时新建线程的方法效率有点低,怎么改进?

35、请问怎么唤醒被阻塞的socket线程?

36、请问怎样确定当前线程是繁忙还是阻塞?

37、空闲的进程和阻塞的进程状态会不会在唤醒的时候误判?

38、请问就绪状态的进程在等待什么?

39、请你说一说多线程的同步,锁的机制

40、两个进程访问临界区资源,会不会出现都获得自旋锁的情况?

41、假设临界区资源释放,如何保证只让一个线程获得临界区资源而不是都获得?

42、C++的锁你知道几种?

43、说一说你用到的锁

44、请你说一说死锁产生的必要条件?

45、请你来说一说协程

47、请你来说一说用户态到内核态的转化原理

48、请你说一下源码到可执行文件的过程

49、请你来说一下微内核与宏内核

50、请你说一下僵尸进程

52、请你来介绍一下5种IO模型

53、请你说一说异步编程的事件循环

54、请你回答一下操作系统为什么要分内核态和用户态

57、请问如何设计server,使得能够接收多个客户端的请求

58、死循环+来连接时新建线程的方法效率有点低,怎么改进?

59、两个进程访问临界区资源,会不会出现都获得自旋锁的情况?

60、假设临界区资源释放,如何保证只让一个线程获得临界区资源而不是都获得?

61、请问怎么实现线程池

63、请你来说一下awk的使用

64、请你来说一下linux内核中的Timer 定时器机制

1、请问怎么确保节点传输存储的可靠性

2、请你说一下TCP怎么保证可靠性,并且简述一下TCP建立连接和断开连接的过程

3、请你说一说TCP的模型,状态转移

4、请回答一下HTTP和HTTPS的区别,以及HTTPS有什么缺点?

6、请你说一说HTTP返回码

7、请你说一说IP地址作用,以及MAC地址作用

8、请介绍一下操作系统中的中断

9、请回答OSI七层模型和TCP/IP四层模型,每层列举2个协议

11、搜索baidu,会用到计算机网络中的什么层?每层是干什么的

12、请你说一说TCP拥塞控制?以及达到什么情况的时候开始减慢增长的速度?

13、请问TCP用了哪些措施保证其可靠性

14、请你说说TCP/IP数据链路层的交互过程

15、请你说说传递到IP层怎么知道报文该给哪个应用程序,它怎么区分UDP报文还是TCP报文

16、请问你有没有基于做过socket的开发?具体网络层的操作该怎么做?(其实就是网络编程的基本步骤)

17、请问server端监听端口,但还没有客户端连接进来,此时进程处于什么状态?

19、请问tcp握手为什么两次不可以?为什么不用四次?

22、请你来说一下TCP拥塞控制?

20、TCP和UDP的区别和各自适用的场景

21、请你来说一下TCP三次握手四次挥手的过程,为什么tcp连接握手需要三次, time_wait状态

22、请你来说一说http协议

23、请你来说一下GET和POST的区别

24、请你来说一下socket编程中服务器端和客户端主要用到哪些函数

25、请你来说一下数字证书是什么,里面都包含那些内容

27、请你讲述一下TCP三次握手,四次挥手,以及为什么用三次握手?

28、请你说一下阻塞,非阻塞,同步,异步

30、请你说一下http协议会话结束标志怎么截出来?

1、请你说一下数据库事务以及四个特性

2、请你说一说数据库的三大范式

3、请你介绍一下数据库的ACID特性

4、请你说一说数据库索引

5、请你说一说数据库事务

6、请你说一说数据库事务隔离

8、请你聊一聊数据库事物的一致性

9、请你说说索引是什么,多加索引一定会好吗

10、k-v存储中,key有哪些要求?

11、介绍数据库中的WAL技术

1.请你说一说mysql的四种隔离状态

3、请问SQL优化方法有哪些

4、请你说一下MySQL引擎和区别

5、知道SQL注入吗?有哪些防御手段?

2、请你来说一说Redis的定时机制怎么实现的

3、请你来说一说Redis是单线程的,但是为什么这么高效呢?

4、请问Redis的数据类型有哪些,底层怎么实现?

6、请问Redis怎么实现的定期删除功能

7、redis的持久化方式有哪几种,分别有什么特点?

1、请你来说一说红黑树和AVL树的定义,特点,以及二者区别

2、请你聊一聊哈夫曼编码

3、请你回答一下map底层为什么用红黑树实现

4、请你介绍一下B+树

6、请你回答一下epoll怎么实现的

7、请你说一说红黑树的性质还有左右旋转

8、请你说一说红黑树的原理以及erase以后迭代器的具体分布情况?

1、请说一说你理解的stack overflow,并举个简单例子导致栈溢出

2、请你回答一下栈和堆的区别,以及为什么栈要快

3、手写代码:两个栈实现一个队列

4、请你来说一下堆和栈的区别

2、一个长度为N的整形数组,数组中每个元素的取值范围是[0,n-1],判断该数组否有重复的数,请说一下你的思路并手写代码

2、请问求第k大的数的方法以及各自的复杂度是怎样的,另外追问一下,当有相同元素时,还可以使用什么不同的方法求第k大的元素

3、请你来介绍一下各种排序算法及时间复杂度

5、请问快排的时间复杂度最差是多少?什么时候时间最差

6、请你介绍一下快排算法;以及什么是稳定性排序,快排是稳定性的吗;快排算法最差情况推导公式

2、请你回答一下hash表如何rehash,以及怎么处理其中保存的资源

3、请你说一下哈希表的桶个数为什么是质数,合数有何不妥?

4、请你说一下解决hash冲突的方法

1、请你手写代码:最长公共连续子序列

2、手写代码:求一个字符串最长回文子串

3、手写代码:查找最长回文子串

1、请你手写代码,如何合并两个有序链表

2、手写代码:反转链表

3、判断一个链表是否为回文链表,说出你的思路并手写代码

5、什么是单向链表,如何判断两个单向链表是否相交

1、如果让你做自然语言理解(NLU),在处理语言规则的时候大概会用到什么算法

2、请问加密方法都有哪些

4、请你说一说洗牌算法

1、给你一个字符串,找出第一个不重复的字符,如“abbbabcd”,则第一个不重复就是c

1、请问你用过哪些设计模式,介绍一下单例模式的多线程安全问题

2、请问你了解哪些设计模式?

3、请问如何保证单例模式只有唯一实例?你知道的都有哪些方法?

4、请你说一说OOP的设计模式的五项原则

5、请你说说工厂模式的优点?

6、请你说一下观察者模式

7、请你介绍一下单例模式

8、单例模式中的懒汉加载,如果并发访问该怎么做?

9、装饰器模式和单例模式,使用单例模式应该注意什么

1、给你两个球,100层楼,每个球在一定高度扔下去会碎,怎么用最少的次数给判断是几层楼能把求摔碎?

2、一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马?

关注公众号【编程珠玑】,获取更多Linux/C/C++/Python/Go/算法/工具等原创技术文章。后台免费获取经典电子书和视频资源

}

我要回帖

更多关于 c语言malloc用法 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信