摘要:目錄第一題第一題分析題目程序會崩潰改正傳地址調用改正返回值接收第二題原因分析第三題第一題問下面函數會輸出什么第一題分析題目程序會崩潰傳參數時是用的傳值,我們都知道傳值是不會改變函數內部的值的。
目錄
//問:下面test函數會輸出什么#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傳參數時是用的傳值,我們都知道傳值是不會改變函數內部的值的。
? ?這就導致了在外部用malloc開辟的空間返回的指向地址的指針無法改變test函數里的str指針。
2.既然不會改變str指針,那str還是NULL,那么在進行strcpy函數拷貝時,會出現*NULL,
? 我們都知道NULL未知的大小位置,所以對NULL解引用是非法操作,所以程序會崩潰。
3.另外一個錯誤也算是老生常談的了,用了動態內存函數申請空間沒有用free函數釋放空間
還要記得將指針置空。
我們既然都知道了錯誤原因,那么改掉錯誤也就十分容易了。
//問:下面test函數會輸出什么#include#include#includevoid GetMemory(char**p)//用二級指針去接收一級指針的地址{ *p=(char*)malloc(100);//*p表示的是一級指針的地址(也就是str的地址),將申請好的內存后, // 返回賦值給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();}
//問:下面test函數會輸出什么#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是局部變量,在棧區上開辟,出了函數,p指針銷毀,但動態內存函數申請的空間在堆區,出了函數不會被銷毀,且指針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數組是在代碼塊之內創建的局部變量,是在棧區上的,p數組出了此函數
就會被銷毀,返回不出任何東西,換言之就是str 接了個寂寞(手動狗頭)。
2.雖然str還是指向數組首元素地址,但是那塊地址已經不存在了。所以會報錯。
?如何改正呢?
最簡單的方法就是將數組和指針在同一個函數中。
for example:
#include#includevoid Test(void){ char p[]="hello world"; char* str=NULL; str=p;//數組名就是首元素地址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;}
顯然會報錯,原因基本和上題類似
經過這兩題我們應該明白了,最主要的原因就在于該值創建在棧區,且返回棧區上創建的值。
在這過程其實我們也明白了,棧區的值不能被返回。改進方法之一是讓這個值不是局部變量,
變成全局變量,或者是靜態變量(其實就是在靜態區或者堆區上創建)就可以了。
這里只講個最簡單的方法(因為咱這里是講動態內存的題,不能在繼續水下去了)
直接在變量前加上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函數提前釋放所申請的空間,但是此時str還是指向原地址,導致strcpy進行對str的拷貝,出現了非法訪問(相當于訪問了一塊不屬于你的空間)。
解決方法:
1.可以是釋放的同時將str指針置NULL,這樣判斷就不會成立也就不會出現后續非法訪問。
?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; }
但仔細看題目分析一波得到前者是答案。
這篇耗時巨大,學費了的小伙伴支持一波
歡迎各位大佬指正
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/119677.html
摘要:先介紹一下本人應屆前端開發一枚,非科班出身,專業是化學,大學期間開始自學前端開發,在今年春招實習和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應屆前端開發一枚,非科班出身,專業是化學...
摘要:先介紹一下本人應屆前端開發一枚,非科班出身,專業是化學,大學期間開始自學前端開發,在今年春招實習和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應屆前端開發一枚,非科班出身,專業是化學...
摘要:先介紹一下本人應屆前端開發一枚,非科班出身,專業是化學,大學期間開始自學前端開發,在今年春招實習和秋招的時候投了一些公司,拿到一些京東拼多多虎牙等,總體來說還算滿意,特地寫一篇文章來總結一下面試的那些套路。 showImg(https://segmentfault.com/img/remote/1460000011897700); 先介紹一下本人應屆前端開發一枚,非科班出身,專業是化學...
摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據自身位置進行偏離,當子元素設置,將依據它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經拖了很久了。現在剛剛開始銀四了,應該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...
摘要:前言接上篇前端筆試題面試題記錄上。默認值,不脫離文檔流,,,,等屬性不生效。。不脫離文檔流,依據自身位置進行偏離,當子元素設置,將依據它進行偏離。。 前言 接上篇前端筆試題面試題記錄(上)。趁清明小長假,把上篇剩下的部分也寫一下,因為最近比較忙這篇已經拖了很久了。現在剛剛開始銀四了,應該還是有些小伙伴在找工作,時間還不算太晚,希望本篇可以幫到這些小伙伴。 個人博客了解一下:obkoro...
閱讀 2759·2021-09-24 10:34
閱讀 1862·2021-09-22 10:02
閱讀 2252·2021-09-09 09:33
閱讀 1457·2021-08-13 15:02
閱讀 3270·2020-12-03 17:10
閱讀 1180·2019-08-30 15:44
閱讀 2144·2019-08-30 12:58
閱讀 3229·2019-08-26 13:40