动态内存传递
2013-04-12 12:17
211 查看
问题描述:动态内存传递错误
代码描述:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//malloc
void getMemory(
char * p )
{
p= (char*)(malloc(100));
}
int main(void)
{
char*p =
NULL;
getMemory(p);
strcpy(p,"Hellow");
printf("%s",p);
free(p);
return0;
}
编译通过,运行时崩溃,调试时发现p值为空,难道是申请内存失败?goole后恍然大悟!
指针作为函数参数时,是按值传递方式,编译器会产生p 的一个副本假设为_p,并使_p=p;这样其实函数内使用的其实并不是p本身,因此p = (char*)(malloc(100));其实是:_p
= (char*)(malloc(100));跟p没有关系。所以p的值在调用函数前后根本就没有改变,其值还是初始化时的NULL,所以就导致内存的非法操作。
解决方法有很多,使用引用传递方式解决为:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//malloc
void getMemory(
char *& p )
{
p= (char*)(malloc(100));
}
int main(void)
{
char*p =
NULL;
getMemory(p);
strcpy(p,"Hellow");
printf("%s",p);
free(p);
return0;
}
代码描述:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//malloc
void getMemory(
char * p )
{
p= (char*)(malloc(100));
}
int main(void)
{
char*p =
NULL;
getMemory(p);
strcpy(p,"Hellow");
printf("%s",p);
free(p);
return0;
}
编译通过,运行时崩溃,调试时发现p值为空,难道是申请内存失败?goole后恍然大悟!
指针作为函数参数时,是按值传递方式,编译器会产生p 的一个副本假设为_p,并使_p=p;这样其实函数内使用的其实并不是p本身,因此p = (char*)(malloc(100));其实是:_p
= (char*)(malloc(100));跟p没有关系。所以p的值在调用函数前后根本就没有改变,其值还是初始化时的NULL,所以就导致内存的非法操作。
解决方法有很多,使用引用传递方式解决为:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//malloc
void getMemory(
char *& p )
{
p= (char*)(malloc(100));
}
int main(void)
{
char*p =
NULL;
getMemory(p);
strcpy(p,"Hellow");
printf("%s",p);
free(p);
return0;
}
相关文章推荐
- IE7降低内存和降低CPU的几个技巧
- 如何高效的使用内存
- DOS下内存的配置
- XP/win2003下发现1G的内存比512M还慢的解决方法
- w3wp.exe占用cpu过高的解决方法第1/2页
- Tomcat内存溢出分析及解决方法
- 一个用了统计CPU 内存 硬盘 使用率的shell脚本
- php页面消耗内存过大的处理办法
- 浅谈SQL Server 对于内存的管理[图文]
- Android 中对于图片的内存优化方法
- 程序的内存分布
- 关于android应用内存占用查看及优化
- 游戏服务器程序基础1-内存/类型转换/编程习惯
- 初识英特尔线程构建模块之内存管理tbb_malloc
- 深度解析Java内存的原型
- 条款16:成对使用new和delete时要采取相同的形式
- 剖析Windows系统用到1G内存慢的原因
- TOMCAT内存不足时的处理.
- java内存泄露问题
- 设置centos上的swap交换分区的方法