环境:
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);
}