为了账号安全,请及时绑定邮箱和手机立即绑定

你好,请问为什么m_ctrmsg赋值后 还是空?

你好,请问为什么m_ctrmsg赋值后 还是空?

梵蒂冈之花 2022-03-21 09:05:25
void CMessage::CreateMessage(const MSG_LOGIN& msg_login){int len = sizeof(MSG_LOGIN);if (m_ctrmsg != NULL){delete m_ctrmsg;}m_ctrmsg = new char[len];memset(m_ctrmsg,0,len);memcpy(m_ctrmsg,(char*)&msg_login,len );}msg_login复制正确 但是m_ctrmsg赋值后 还是空 看不到值
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

内存复制函数及内存的一些思考

内存复制函数:

void *memcpy(void *pvTo,const void *pvFrom,size_t size)
{
assert((pvTO !=NULL)&&(pvFrom != NULL)); //使用断言,防止pvTo或pvFrom为NULL

typedef char byte;
byte *pbto =(byte *)pvTo; //防止改变pvTo的地址
byte *pbfrom = (byte *)pvFrom; //防止改变pvFrom的地址

while(size-->0)
{
*pbTo++ = *pbFrom++;
}
return pbto;
}

关于内存思考:

第一种情况:
/*
*程序崩溃
*因为getmemory并不能传递动态内存,test函数中的str一直都是NULL。
*/
void getmemory(char *p)
{
p = (char *)malloc(100);
}

void test(void)
{

char *str = NULL;
getmemory(str);
strcpy(str,"hello,world"); //使程序崩溃
printf(str);
}

第二种情况:
/*
*可能是乱码
*因为getmemory返回的是只想“栈内存”的指针,该指针的地址不是NULL,
*但其原有的内容已经被清除,新内容不可知。
*/

char *getmemory(void)
{
char p[]="hello world";
return p;
}

void test(void)
{
char *str = NULL;
str=getmemory();
// strcpy(str,"hello,world");
printf(str);
}

第三种情况:
/*
*能够输出hello;
*内存泄露;
*
*/

void *getmemory(char **p,int num)
{
*p = (char *)malloc(num);
}

void test(void)
{
char *str = NULL;
getmemory(&str,100);
strcpy(str,"hello");
printf(str);
}

第四种情况:
/*
*篡改动态内存区的内容,后果难以预料,非常危险。因为free(str)之后,str称为野指针,
*if(str!=NULL)语句不起作用
*/
void test(void)
{
char *str = (char *)malloc(100);
strcpy(str,"hello");
free(str);
if(str != NULL)
{
strcpy(str,"world");
printf(str);
}
}

问题:动态内存会被自动释放掉吗?

void Func(void)
{
char *p = (char *)malloc(100);
}

(1)指针消亡了,并不表示它指向的内存会被自动释放;
(2)内存被释放了,并不表示指针会消亡或者称为NULL;



查看完整回答
反对 回复 2022-03-23
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信