直接上**吧
過程就是這樣的,那麼如果讓這段程式執行,會產生什麼樣的效果呢?這段**有兩個問題,我們分析一下。
1.p是個區域性變數,這getmemory這個函式執行完之後,p就被銷毀了,返回空指標。這塊在堆上動態開闢的空間也就找不到了,從而造成記憶體洩漏。
2.p是str的臨時拷貝,str和p並不是同一塊空間,str中還是空指標,不能解引用進行strcpy操作,導致程式崩潰。
存在問題:程式崩潰和記憶體洩漏
修改**
void getmemory(char **p)
void test(void)
int main()
我把str位址當做引數傳了過去,這樣就可以在函式外部修改函式內部的值了。str就可以接收到所開闢的100個位元組的空間了。當然還可以在getmemory函式中將p返回,返回型別為char*,在main函式中用str接受一下即可。方法不唯一,但是一定一定不要忘記了釋放空間哦!
如讓它執行,不難發現會有這個警告: warning c4172: 返回區域性變數或臨時變數的位址。
其實是這樣的,這屬於返回棧空間位址問題。p陣列是乙個區域性變數,在函式呼叫完之後,值就被銷毀了(還給作業系統了),我們可以看到返回了p的位址,那麼此時的位址就不一定還存著原來的值。然後還進行了列印,這就造成了非法訪問。因此,返回棧空間位址是不靠譜兒的。。
存在問題:非法訪問
修改**
char *getmemory(void)
void test(void)
int main()
將p改為*p就正確啦,改了之後,hello world 就是乙個常量字串,不放在棧上了,返回h的位址,str接收列印就沒有問題了。
void getmemory(char **p, int num)
void test(void)
int main()
其實,這道題的問題只有乙個,那就是記憶體洩漏,我們改正的方法就是在printf之後加上free(str); str = null;就可以了。
void test(void)
}int main()
顯然,這個**邏輯就不對,已經執行了strcpy(str, "hello"),就已經預設了這不是空指標了,然後在下面還進行判斷,顯然錯誤。我們如何改正呢?其實,在free(str)後面加上這樣乙個語句(str = null)。這樣操作之後,free之後,將str指向的空間還給作業系統,再將空指標賦給str,然後判斷str不為空指標(才有意義)進行字串複製。 幾個關於GetMemory的經典問題
test1 void getmemory1 char p void test1 void 呼叫getmemory str 後,str並未產生變化,依然是null。改變的只是str的乙個拷貝的記憶體的變化 strcpy str,hello world 程式執行到這將產生錯誤。test2 char ge...
Getmemory的幾個經典的關於記憶體的筆試題
面試c 程式設計師時用得著的幾道題 getmemory的幾個經典的關於記憶體的筆試題 void getmemory1 char p void test1 void str一直是空,程式崩潰 char getmemory2 void void test2 void char getmemory3 vo...
if和for的幾個經典題目
1.有一對幼兔,幼兔1個月後長成小兔,小兔1個月後長成成兔並生下一對幼兔,問幾年後有多少對兔子,幼兔 小兔 成兔對數分別是多少。幼兔 1 小兔 0 成兔 0 幼兔 0 小兔 1 成兔 0 幼兔 1 小兔 0 成兔 1 幼兔 1 小兔 1 成兔 1 幼兔 2 小兔 1 成兔 2 幼兔 3 小兔 2 成...