C基础--函数参数副本
2024-08-24 03:02:45
转自:http://blog.csdn.net/chujiangke001/article/details/38553173
void GetMemory(char *p, int num)
{
p = (char*)malloc(sizeof(char)*num);
} void main(void)
{
char *str = NULL;
GetMemory(str,); //str仍然为NULL
strcpy(str,"hello"); //运行时出错
cout<<str<<endl;
}
请问运行mian函数的结果如何?其实运行是会报错的,为什么呢?
毛病出在GetMemory中。
编译器总是要为函数的每个参数制作临时副本,指针参数p的副本是_p, 编译器使_p=p(二者指向同一块区域)。如果函数体内的程序修改了_p指向的内容,就导致参数p指向的内容做了相应的修改,这就是指针可以用做输出参数的原因。
但是在上述的代码中,_p申请了新的内存,也就是_p本身的值改变了,即指向了新的内存空间,但是p本身丝毫未变。所以函数GetMemory并不能输出任何东西。事实上,每执行一次GetMemory就会泄露一块内存,因为没有用free释放内存。
最新文章
- PV、UPV、UV简介
- OC面向对象—封装
- Linq查询数据集取得排序后的序列号(行号)
- jquery中的each方法,$.each \ this.each \ $.fn.each
- OJ题目分类
- oracle如何获取当年第一月,如今年是2015年,则需获取 201501
- Asp.Net HttpApplication请求管道与Session(一)
- 【进制问题】【HDU2056】A + B Again
- Idea+maven+tomcat部署第一个tomcat项目
- 分布式监控系统Zabbix3.2对数据库的连接数预警
- Nginx反向代理解决iframe跨域问题
- Jmeter性能结果分析
- python之字符编码(三)
- 树上第k大联通块
- C# 多线程之List的线程安全问题
- delphi 图片加水印源代码
- winform listbox 使用DrawMode使用OwnerDrawVarialbe或OwnerDrawFixed无水平滚动条
- U-Mail邮件群发触发器功能助力营销自动化
- 【转载】注释AFX_MSG_MAP,AFX_DATA,AFX_DATA_MAP , Afx_MSG等宏不能删除
- pip安装tensorflow出错怎么办