- 1、本文档共9页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
c语言指针GetMemory经典例子
?
GetMemory的典型例子
2010-01-13 18:24?520人阅读?评论(2)?收藏?举报
//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步,将不难发现问题 所在!
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类型的指针str,并把str指向NULL.调用函数的过程中做了如下动作:1申请一数组p[]并将其赋值为hello world(数组的空间大小为12),2返回数组名p付给str指针(即返回了数组的首地址).那么这样就可以打印出字符串"hello world"了么?当然是不能的!因为在函数调用的时候漏掉了最后一步.也就是在第2步return数组名后,函数调用还要进行一步操作,也就是释放内存 空间.当一个函数被调用结束后它会释放掉它里面所有的变量所占用的空间.所以数组空间被释放掉了,也就是说str所指向的内容将不确定是什么东西.
char *GetMemory(void)
{
?? char p[] = hello world;
?? return p;
}
void Test(void)
{
?? char *str = NULL;
?? str = GetMemory();
?? printf(str);
}
//NO.3:问题同NO.1,正确答案为可以打印出hello.但内存泄漏了!
void GetMemory(char **p, int num)
{
?? *p = (char*)malloc(num);
}
void Test(void)
{
?? char *str = NULL;
?? GetMemory(str, 100);
?? strcpy(str, hello);
?? printf(str);
}
//NO.4: 申请空间,拷贝字符串,释放空间.前三步操作都没有任何问题.到if语句里的判断条件开始出错了,因为一个指针被释放之后其内容并不是NULL,而是一个 不确定的值.所以if语句永远都不能被执行.这也是著名的"野"指针问题.所以我们在编写程序释放一个指针之后一定要人为的将指针付成NULL.这样就会 避免出现"野"指针的出现.有人说"野"指针很可怕,会带来意想不到的错误.
void Test(void)
{
?? char *str = (char*)malloc(100);
?? strcpy(str, hello);
?? free(str);
?? if (str != NULL)
?? {
????? strcpy(str, world);
???? printf(str);
?? }
}
void GetMemory1(char *p)
{
??? p = (char *)malloc(100);
}
void Test1(void)
{
??? char *str = NULL;
??? GetMemory1(str);
??? strcpy(str, hello world);
??? printf(str);
}
//str一直是空,程序崩溃
char *GetMemory2(void)
{
??? char p[] = hello world;
??? return p;
}
void Test2(void)
{
??? char *str = NULL;
??? str = GetMemory2();
??? printf(str);
}
char *GetMemory3(void)
{
???? return hello world;
}
void Test3(void)
{
??? char *str = NULL;
??? str = GetMemory3();
??? printf(str);
}
//Test3 中打印hello world,因为返回常量区,而且并没有被修改
文档评论(0)