常見的動態(tài)內(nèi)存錯(cuò)誤:
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括會澤網(wǎng)站建設(shè)、會澤網(wǎng)站制作、會澤網(wǎng)頁制作以及會澤網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,會澤網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到會澤省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!1、對NULL指針的解引用操作
void test()
{int*p=(int*)malloc(INT_MAX/4);
*p= 20;//如果p的值是NULL,就會有問題
free(p);
}
2、對動態(tài)開辟空間的越界訪問
void test()
{int i=0;
int*p=(int*)malloc(10*sizeof(int));
if(NULL== p)
{ exit(EXIT_FAILURE);
}
for(i=0;i<=10;i++)
{ *(p+i)=i;//當(dāng)i是10的時(shí)候越界訪問
}
free(p);
}
3、對非動態(tài)開辟內(nèi)存使用free釋放
void test()
{int a=10;
int *p=&a;
free(p);//定義的a是棧區(qū)的,不能用free釋放
}
4、使用free釋放一塊動態(tài)開辟內(nèi)存的一部分
void test()
{int*p=(int*)mal1oc(100);
p++;
free(p);//p不再指向動態(tài)內(nèi)存的起始位置
}
5、對同一塊動態(tài)內(nèi)存多次釋放
void test()
{int *p= (int*)malloc(100);
free(p);
free(p);//重復(fù)釋放
}
6、動態(tài)開辟內(nèi)存忘記釋放(內(nèi)存泄露)
while(1)
{malloc(1);//內(nèi)存不釋放,占的內(nèi)存會越來越大
}
所以切記:動態(tài)開辟的空間一定要釋放,并且正確釋放。
下面有四道關(guān)于動態(tài)內(nèi)存分配錯(cuò)誤的筆試題:
第一題:
void GetMemory(char*p)
{ p=(char*)malloc(100);
}
void Test(void)
{ char*str=NULL;
GetMemory(str);
strcpy(str, "hello world') ;
printf(str);
}
int main()
{ test () ;
}
答:該程序是錯(cuò)誤的。因?yàn)閠est運(yùn)行之后,p申請的內(nèi)存空間其實(shí)并沒有給到str,因此str無法打印出hello world。而且p申請的內(nèi)存并沒有進(jìn)行free操作,造成了內(nèi)存泄漏。
第二題:
char*GetMemory(void)
{ char p[]="hello world";
return p;
}
void Test(void)
{ char*str=NULL;
str=GetMemory;
printf(str);
}
int main()
{ test();
return 0;
}
答:該程序是有問題的。該題雖然return p了,但是在GetMemory函數(shù)結(jié)束之后,p銷毀了。因此p成為了野指針。
第三題:
void GetMemory(char**p,int num)
{ *p=(char*)malloc(num);
}
void test(void)
{ char*str=NULL;
GetMemory(&str,100);
strcpy(str,"hello");
printf(str);
}
int main()
{ test();
return 0;
}
答:該程序存在內(nèi)存泄漏問題,沒有free釋放。但是該題可以正常打印出hello,因?yàn)関p接收的是str的地址,因此p申請到內(nèi)存空間時(shí),str就是其首地址。因此可以打印出。
第四題:
void*Test(void)
{char*str=(char*)malloc(100);
strcpy(str,"hello");
free(str);
if(str!=NULL);
{ strcpy(str,"world");
printf("str");
}
}
int main()
{Test();
return 0;
}
答:該程序free提前釋放了,釋放完后再將world字符拷貝進(jìn)去,可是那塊空間已經(jīng)不屬于str了,造成了非法訪問。結(jié)構(gòu)雖然能打印出world,但是還是有問題存在的。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧