C语言内存分配问题.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言内存分配问题

 HYPERLINK /blog/458232 C语言内存分配问题 1、C中内存分为四个区 栈:用来存放函数的形参和函数内的局部变量。由编译器分配空间,在函数执行完后由编译器自动释放。 堆:用来存放由动态分配函数(如malloc)分配的空间。是由程序员自己手动分配的,并且必须由程序员使用free释放。如果忘记用free释放,会导致所分配的空间一直占着不放,导致内存泄露。 全局区:用来存放全局变量和静态变量。存在于程序的整个运行期间,是由编译器分配和释放的。 文字常量区:例如char *c = “123456”;则”123456”为文字常量,存放于文字常量区。也由编译器控制分配和释放。 程序代码区:用来存放程序的二进制代码。 例子(一) int a = 0; //全局区 void main() { int b; //栈 char s[] = abc; //s在栈,abc在文字常量区 char *p1,*p2; //栈 char *p3 = 123456; //123456在常量区,p3在栈上 static int c =0; //全局区 p1 = (char *)malloc(10); //p1在栈,分配的10字节在堆 p2 = (char *)malloc(20); //p2在栈,分配的20字节在堆 strcpy(p1, 123456); //123456放在常量区 } 例子(二) //返回char型指针 char *f() { //s数组存放于栈上 char s[4] = {1,2,3,0}; return s; //返回s数组的地址,但程序运行完s数组就被释放了 } void main() { char *s; s = f(); printf (%s, s); //打印出来乱码。因为s所指向地址已经没有数据 } 2、动态分配释放内存 用malloc动态分配内存后一定要判断一下分配是否成功,判断指针的值是否为NULL。 内存分配成功后要对内存单元进行初始化。 内存分配成功且初始化后使用时别越界了。 内 存使用完后要用free(p)释放,注意,释放后,p的值是不会变的,仍然是一个地址值,仍然指向那块内存区,只是这块内存区的值变成垃圾了。为了防止后 面继续使用这块内存,应在free(p)后,立即p=NULL,这样后面如果要使用,判断p是否为NULL时就会判断出来。 NO.1 void GetMemory(char *p) { p = (char *)malloc(100); } void Test(void) { char *str = NULL; GetMemory(str); strcpy(str,hello world); printf(str); } 请问运行Test函数后会是什么样的结果? NO.2 char *GetMemory(void) { char p[] = hello world; retrun p; } void Test(void) { char *str = NULL; str = GetMemory(); printf(str); } 问题同NO.1 NO.3 void GetMemory2(char **p, int num) { *p = (char *)malloc(num); } void Test(void) { char *str = NULL; GetMemory(str,100); strcpy(str,hello); printf(str); } 问题同NO.1 NO.4 void Test(void) { char *str = (char *)malloc(100); strcpy(str,hello); free(str); if(str != NULL) { strcpy(str,world); printf(str); } } 问题同NO.1 我对以上问题的分析: NO.1: 程序首先申请一个char类型的指针str,并把str指向NULL(即str里存的是NULL的地址,*str为NULL中的值为0),调用函数的过程 中做了如下动作:1申请一个char 类型的指针p,2把str的内容copy到了p里(这是参数传递过程中系统所做的),3为p指针申请了100个空间,4返回Test函数.最后程序把字符 串hello world拷贝到str指向的内存空间里.到这里错误出现了!str的空间始终为NULL而并没有实际的空间.深刻理解函数调用的第2步,将不难发现问题 所在!(建议:画图理

文档评论(0)

cgtk187 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档