用指针做传出参数的错误分析

来源:互联网 发布: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);}



原创粉丝点击