用指针做传出参数的错误分析
来源:互联网 发布:jsp mysql购物车代码 编辑:程序博客网 时间:2024/06/10 18:44
环境:
Linux C++
问题:
memcpy(data, transBuf+nMsgHeadSize, dataLen);
调试,查看内存如下:
(gdb) print data
$19 = 0xb67e237c ""
(gdb) print transBuf+nMsgHeadSize
$20 = 0x8070460 "xuwei"
代码如下:
传一个指针参数进去,
#include <string.h>#include <stdio.h>void myMemcpy(char * data){ const char * str="I love china"; int dataLen=strlen(str)+1; data=new char[dataLen]; memset(data, 0, dataLen); memcpy(data, str, dataLen); printf("in function: data=%s\n", data);}int main(){ char * data; myMemcpy(data); printf("after function: data=%s\n", data);}执行结果如下:
in function: data=I love china
after function: data=|}
可见,在函数myMemcpy()中的指针确实指向了有效的字符
分析原因:
指针作为参数传递时,在函数中实际上会重新创建一个指针,该指针与作参数的指针指向同一片内存空间
如果作为参数传递之前,该指针已经有了分配好的内存空间,则上面的函数可以正确执行;
但如果该指针没有对应的内存空间,即空指针,则传递给函数的指针跟函数创建的指针之间就不存在任何联系,因此,修改函数创建的指针对作为参数的指针根本没有任何影响,因为两者不指向一片内存空间。
解决办法:
(1)传递指针的指针,即二级指针进去
void myMemcpy(char ** data){ const char * str="I love china"; int dataLen=strlen(str)+1; (*data)=new char[dataLen]; memset((*data), 0, dataLen); memcpy((*data), str, dataLen); printf("in function: data=%s\n", (*data));}int main(){ char * data; myMemcpy(&data); printf("after function: data=%s\n", data);}
(2)事先为做参数的指针分配好空间
void myMemcpy(char * data){ const char * str="I love china"; int dataLen=strlen(str)+1; memset(data, 0, dataLen); memcpy(data, str, dataLen); printf("in function: data=%s\n", data);}int main(){ char * data=new char[16]; memset(data, 0, 16); myMemcpy(data); printf("after function: data=%s\n", data);}
- 用指针做传出参数的错误分析
- 函数传出参数,用指针作为函数的传出参数实现多值返回
- 通过指针的指针来实现传出参数
- 指针做参数容易犯的错误
- 使用二级指针传出参数
- 函数的指针参数传出时遇到的问题
- linux c 利用指针将函数传出参数的值
- 函数的传出参数
- 指针做参数 二级指针的详细分析
- 指针用作传出参数时,需要二级指针
- 指针用作传出参数时,需要二级指针
- 存储过程的output参数的传出
- 指针以及指针做参数的问题
- pthread_join得到pthread_exit传出来的参数
- 函数的传入和传出参数
- 函数指针,指针函数,指针的指针做函数参数
- 善用指针---用指针做函数参数
- c语言用指针做函数参数和用变量做函数参数的不同点
- 2010北邮复试网研上机题——打牌
- Android进阶高手(五)之Android聊天室(2)
- [转载] 20个令人恐怖的JavaScript导航技术
- 互联网产品“冷启动”问题浅析
- Mac OS X Lion 安装之后, AppStore 显示正在加载 (Loading)
- 用指针做传出参数的错误分析
- 采用CSS让DIV在网页中水平垂直居中
- 一日一步 之SQLServer数据库的表操作
- 001:C语言API示例【abort】
- oracle logminer 使用总结!
- 注意,CFileDialog 会改变当前路径
- android之组件3
- 三种分页查询
- C# winform 安装程序打包(自定义操作)