關於記憶體問題的幾個經典題目

2021-09-26 21:02:29 字數 1684 閱讀 2405

直接上**吧

過程就是這樣的,那麼如果讓這段程式執行,會產生什麼樣的效果呢?這段**有兩個問題,我們分析一下。

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 成...