成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

手撕大廠出現(xiàn)的過的一些筆試題---------動態(tài)內(nèi)存函數(shù)題

siberiawolf / 2264人閱讀

摘要:目錄第一題第一題分析題目程序會崩潰改正傳地址調(diào)用改正返回值接收第二題原因分析第三題第一題問下面函數(shù)會輸出什么第一題分析題目程序會崩潰傳參數(shù)時是用的傳值,我們都知道傳值是不會改變函數(shù)內(nèi)部的值的。

目錄

第一題:

第一題分析題目程序會崩潰:

改正1:(傳地址調(diào)用)

改正2:(返回值接收)

第二題:

原因分析:

第三題:


第一題:

//問:下面test函數(shù)會輸出什么#Include#includevoid GetMemory(char*p){   p=(char*)malloc(100);}void test(void){  char*str=NULL;  GetMemory(str);  strcpy(str,"hello world");  printf(str);}int main(){    test();}

第一題分析題目程序會崩潰:

1.?GetMemory傳參數(shù)時是用的傳值,我們都知道傳值是不會改變函數(shù)內(nèi)部的值的。

? ?這就導(dǎo)致了在外部用malloc開辟的空間返回的指向地址的指針無法改變test函數(shù)里的str指針。

2.既然不會改變str指針,那str還是NULL,那么在進行strcpy函數(shù)拷貝時,會出現(xiàn)*NULL,

? 我們都知道NULL未知的大小位置,所以對NULL解引用是非法操作,所以程序會崩潰。

3.另外一個錯誤也算是老生常談的了,用了動態(tài)內(nèi)存函數(shù)申請空間沒有用free函數(shù)釋放空間

還要記得將指針置空。

我們既然都知道了錯誤原因,那么改掉錯誤也就十分容易了。

改正1:(傳地址調(diào)用)

//問:下面test函數(shù)會輸出什么#include#include#includevoid GetMemory(char**p)//用二級指針去接收一級指針的地址{   *p=(char*)malloc(100);//*p表示的是一級指針的地址(也就是str的地址),將申請好的內(nèi)存后,                        // 返回賦值給str,從而使外部的str的值指向了開辟好的首地址。}void test(void){  char*str=NULL;  GetMemory(&str);//傳地址就沒問題  strcpy(str,"hello world");//此時str不再是NULL了,而是新申請的首元素地址  printf(str);//打印出hello world  free(str);  str=NULL;//說爛了,不說了,簡稱一套帶走,嘻嘻??!}int main(){    test();}

改正2:(返回值接收)

//問:下面test函數(shù)會輸出什么#include#include#includechar* GetMemory(char*p){	return p = (char*)malloc(100);}void test(void){	char*str = NULL;	str = GetMemory(str);//返回值接收	strcpy(str, "hello world");	printf(str); 	free(str);	str = NULL;}int main(){	test();}

注意:上面的解法中雖然p是局部變量,在棧區(qū)上開辟,出了函數(shù),p指針銷毀,但動態(tài)內(nèi)存函數(shù)申請的空間在堆區(qū),出了函數(shù)不會被銷毀,且指針p在銷毀是已將開辟好的地址傳給了str,所以可行。

第二題:

#include#includechar* GetMemory(void){   char p[]="hello world";   return 0;}void Test(void){  char* str=NULL;  str=GetMemory();  printf(str);}int main(){  Test(); return 0;}

原因分析:

1.由題目可知,p數(shù)組是在代碼塊之內(nèi)創(chuàng)建的局部變量,是在棧區(qū)上的,p數(shù)組出了此函數(shù)

就會被銷毀,返回不出任何東西,換言之就是str 接了個寂寞(手動狗頭)。

2.雖然str還是指向數(shù)組首元素地址,但是那塊地址已經(jīng)不存在了。所以會報錯。

?如何改正呢?

最簡單的方法就是將數(shù)組和指針在同一個函數(shù)中。

for example:

#include#includevoid Test(void){ char p[]="hello world";  char* str=NULL;  str=p;//數(shù)組名就是首元素地址str指向h  printf(str);}int main(){  Test(); return 0;}

這樣是不是非常的easy

還有幾個和上面那個類似的題

for example:

#includeint * test(){  int a=10;  return &a;//返回a的地址  }int main(){  int *pp =test(); *pp=20;//將a賦值,成功? return 0;}

顯然會報錯,原因基本和上題類似

經(jīng)過這兩題我們應(yīng)該明白了,最主要的原因就在于該值創(chuàng)建在棧區(qū),且返回棧區(qū)上創(chuàng)建的值。

在這過程其實我們也明白了,棧區(qū)的值不能被返回。改進方法之一是讓這個值不是局部變量,

變成全局變量,或者是靜態(tài)變量(其實就是在靜態(tài)區(qū)或者堆區(qū)上創(chuàng)建就可以了。

這里只講個最簡單的方法(因為咱這里是講動態(tài)內(nèi)存的題,不能在繼續(xù)水下去了)

直接在變量前加上static

#includeint *test(){    static int a=10;  return &a;//返回a的地址  }int main(){  int *pp= test(); *pp=20;//將a賦值,成功?   return 0;}

至于static的用法有小伙伴不知第道的可以私信我,或者后期出一期講解

第三題:

#include#include#includevoid 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函數(shù)提前釋放所申請的空間,但是此時str還是指向原地址,導(dǎo)致strcpy進行對str的拷貝,出現(xiàn)了非法訪問(相當(dāng)于訪問了一塊不屬于你的空間)。

解決方法:

1.可以是釋放的同時將str指針置NULL,這樣判斷就不會成立也就不會出現(xiàn)后續(xù)非法訪問。

?2.??也可以是在使用完后釋放再置空

第一種:

#include#include#includevoid Test(void){  char*str=(char*)malloc(100);   strcpy(str,"hello");  free(str);  str=NULL;   if(str!=NULL)  {    strcpy(str,"world");    printf(str);  }}int main() {    Test();   return 0; }

第二種:就是將free(str)和str放到printf之后。

#include#include#includevoid Test(void){  char*str=(char*)malloc(100);   strcpy(str,"hello");   if(str!=NULL)  {    strcpy(str,"world");    printf(str);   free(str);   str=NULL;  }}int main() {    Test();   return 0; }

但仔細看題目分析一波得到前者是答案。

這篇耗時巨大,學(xué)費了的小伙伴支持一波

歡迎各位大佬指正

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/119677.html

相關(guān)文章

  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試真

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實習(xí)和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    sunnyxd 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試真

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實習(xí)和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    jeyhan 評論0 收藏0
  • 前端開發(fā)應(yīng)屆生面試指南(含各大公司具體指南及面試真

    摘要:先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué),大學(xué)期間開始自學(xué)前端開發(fā),在今年春招實習(xí)和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結(jié)一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應(yīng)屆前端開發(fā)一枚,非科班出身,專業(yè)是化學(xué)...

    lentoo 評論0 收藏0
  • 前端記錄(下)

    摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...

    Lin_YT 評論0 收藏0
  • 前端記錄(下)

    摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據(jù)自身位置進行偏離,當(dāng)子元素設(shè)置,將依據(jù)它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經(jīng)拖了很久了?,F(xiàn)在剛剛開始銀四了,應(yīng)該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...

    suemi 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<