- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
内存、指针与结构体
内存、指针与结构体 C语言内存管理 由C编译的程序占用的内存分为以下几个部分: 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。 2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。 3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量在一块区域; 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放。 5、程序代码区—存放函数体的二进制代码。 什么是堆 堆是大家共有的空间,分全局堆和局部堆。 全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。 堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏。 什么是栈 栈是线程独有的,保存其运行状态和局部自动变量的。 栈在线程开始的时候初始化,每个线程的栈互相独立。每个函数都有自己的栈,栈被用来在函数之间传递参数。操作系统在切换线程的时候会自动的切换栈。 栈空间不需要在高级语言里面显式的分配和释放。 //main.c int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() //程序代码区 { int b; //栈 char s[ ] = “abc”; //栈 char *p2; //栈 char *p3 = “1234”; //1234\0在文字常量区,p3在栈上。 static int c =0; //全局(静态)初始化区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来的10和20字节的区域就在堆区。 } malloc和free void *malloc(long NumBytes); 该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。 void free(void *FirstByte); 该函数是将之前用malloc分配的空间还给程序或者是操作系统,也就是释放了这块内存,让它重新得到自由。 malloc() 从哪里得到了内存空间? 答案是从堆里面获得空间。也就是说函数返回的指针是指向堆里面的一块内存。 操作系统中有一个记录空闲堆内存地址的链表。当操作系统收到程序的申请时,就会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。 char* Function( ) { char *p = (char *)malloc(100 *sizeof(char)); return p; } free()到底释放了什么 ? free()释放的是指针指向的内存! 注意!释放的是内存,不是指针!这点非常非常重要!指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的。释放内存后把指针指向NULL,防止指针在后面不小心又被引用了。 程序代码: // code... char *Ptr = NULL; Ptr = (char *)malloc(100 * sizeof(char)); if (NULL == Ptr) { exit (1); } // code... free(Ptr); Ptr = NULL; // code... //main.c int a = 0; 全局初始化区 char *p1; 全局未初始化区 main() //程序代码区 { int b; //栈 char s[ ] = “abc”; //栈 char *p2; //栈 char *p3 = “1234”
文档评论(0)