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;
添加回答
举报