- 4
- 0
- 约2.89千字
- 约 4页
- 2017-05-16 发布于重庆
- 举报
使用指针做函数返回值和指针(栈内存与堆内存的函数形式使用)
一、使用指针做函数返回值:
1、当使用指针做为函数的返回值时,主函数处的char *p;将获得调用函数char *pf;的值,即一个地址值,如oxAE72。此时需要我们注意的是该地址值所指向的空间是否存在(即已向操作系统声明注册,不会被释放,即可能被其他操作修改);
2、使用栈内存返回指针是明显错误的,因为栈内存将在调用结束后自动释放,从而主函数使用该地址空间将很危险。
例如:
char* GetMemory()
{
char p[] = hi;
return p;
}
void main()
{
char *str = GetMemory(); //出错! 得到一块已释放的内存
printf(str);
}
3、使用堆内存返回指针是正确的,但是注意可能产生内存泄露问题,在使用完毕后主函数中释放该段内存。
例如:
char* GetMemory()
{
char *p = new char[100];
return p;
}
void main()
{
char *str = GetMemory();
delete [] str; //防止内存泄露!
}
二、使用指针做函数参数:
1、有的情况下我们可能需要需要在调用函数中分配内存,而在主函数中使用,而针对的指针此时为函数的参数。此时应注意形参与实参的问题,因为在C语言中,形参只是继承了实参的值,是另外一个量(ps:返回值也是同理,传递了一个地址值(指针)或实数值),形参的改变并不能引起实参的改变。
2、直接使用形参分配内存的方式显然是错误的,因为实参的值并不会改变,如下则实参一直为NULL:
void GetMemory(char* p)
{
char *p = new char[100];
}
void main()
{
char *str;
GetMemory(str);
strcpy(str, hi); //出错! str = NULL!
}
3、由于通过指针是可以传值的,因为此时该指针的地址是在主函数中申请的栈内存,我们通过指针对该栈内存进行操作,从而改变了实参的值。
void Change(char *p)
{
*p = b;
}
void main()
{
char a = a;
char* p = a;
Change(p);
printf(%cn, a); //值a改变!
}
4、根据上述的启发,我们也可以采用指向指针的指针来进行在调用函数中申请,在主函数中应用。如下:假设a的地址为ox23,内容为a;而str的地址是ox46,内容为ox23;而pstr的地址是ox79,内容为ox46。
我们通过调用函数GetMemory,从而将pstr的内容赋给了p,此时p = ox46。通过对*p(ox23)的操作,即将内存地址为ox23之中的值改为char[100]的首地址,从而完成了对char* str地址的分配。
void GetMemory(
您可能关注的文档
最近下载
- 神经内科疾病疑难病例分析.ppt
- m项目接受度表.doc VIP
- (五个带头)关于2025年度组织生活会个人查摆问题的整改清单.docx VIP
- 2026支部民主生活会个人对照检查材料(五个带头)8篇.docx VIP
- 2025年生物燃料生产环境风险评估报告.docx
- 大连交通大学《分析化学》2024 - 2025 学年第一学期期末试卷.pdf VIP
- 国际市场营销(双语版)(陈秀梅 吴含 冯克江)PPT全套完整教学课件.pptx
- 10 2024年香港华夏杯四年级竞赛复赛数学试卷.docx VIP
- 广州南洋理工职业学院公共课《大学计算机基础》期末试卷A(有答案).docx VIP
- 西门子Camstar MES的介绍.docx
原创力文档

文档评论(0)