1 回答

TA貢獻(xiàn)1806條經(jīng)驗 獲得超5個贊
內(nèi)存復(fù)制函數(shù)及內(nèi)存的一些思考
內(nèi)存復(fù)制函數(shù):
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;
}
關(guān)于內(nèi)存思考:
第一種情況:
/*
*程序崩潰
*因為getmemory并不能傳遞動態(tài)內(nèi)存,test函數(shù)中的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返回的是只想“棧內(nèi)存”的指針,該指針的地址不是NULL,
*但其原有的內(nèi)容已經(jīng)被清除,新內(nèi)容不可知。
*/
char *getmemory(void)
{
char p[]="hello world";
return p;
}
void test(void)
{
char *str = NULL;
str=getmemory();
// strcpy(str,"hello,world");
printf(str);
}
第三種情況:
/*
*能夠輸出hello;
*內(nèi)存泄露;
*
*/
void *getmemory(char **p,int num)
{
*p = (char *)malloc(num);
}
void test(void)
{
char *str = NULL;
getmemory(&str,100);
strcpy(str,"hello");
printf(str);
}
第四種情況:
/*
*篡改動態(tài)內(nèi)存區(qū)的內(nèi)容,后果難以預(yù)料,非常危險。因為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);
}
}
問題:動態(tài)內(nèi)存會被自動釋放掉嗎?
void Func(void)
{
char *p = (char *)malloc(100);
}
(1)指針消亡了,并不表示它指向的內(nèi)存會被自動釋放;
(2)內(nèi)存被釋放了,并不表示指針會消亡或者稱為NULL;
添加回答
舉報