#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
char* test() {
char* s = "Hello World";
size_t len = strlen(s);
char* t = malloc(sizeof(char)*(len 1));
strcpy(t, s);
free(t);
return t;
};
int main(void) {
printf("%s\n", test());
return 0;
};
我想在函式內部分配和取消分配記憶體。我測驗了這段代碼并且有效,但我想知道:
- 為什么這樣做?
- 在 中使用已釋放指標的值是一種好習慣
main嗎?
uj5u.com熱心網友回復:
一旦你呼叫free一個指標,它指向的記憶體就不再有效。嘗試使用指向已釋放記憶體的指標會觸發未定義的行為。在這種特殊情況下,它碰巧有效,但不能保證。
如果函式回傳分配的記憶體,則呼叫者有責任釋放它:
char* test() {
char* s = "Hello World";
size_t len = strlen(s);
char* t = malloc(sizeof(char)*(len 1));
strcpy(t, s);
return t;
};
int main(void) {
char *t = test();
printf("%s\n", t);
free(t);
return 0;
};
uj5u.com熱心網友回復:
malloc 保留記憶體以供使用。
free釋放該保留。通常,它不會使記憶體消失,不會更改該記憶體的內容,也不會更改保存地址的指標的值。
之后free(t), 的位元組t仍然包含與之前相同的位設定free。然后return t;將這些位回傳給呼叫者。
當main將這些位傳遞給 時printf,printf將它們用作獲取 的字符的地址%s。由于沒有任何改變它們,它們被列印出來。
這就是為什么你會得到你對這個程式所做的行為。然而,沒有一個是有保證的。一旦free被呼叫t,記憶體預留就消失了。程式中的其他內容可能使用了該記憶體。例如,printf可能為自己的內部使用分配了一個緩沖區,并且可能使用了相同的記憶體。
在大多數情況下,malloc并且free正在協調使用記憶體的只是方法,讓你的程式的不同部分不要試圖在同一時間為不同的目的使用相同的記憶體。當您的程式中只有一部分使用分配的記憶體時,程式的其他部分不會干擾它。所以缺乏協調并沒有導致你的程式失敗。如果您的程式中有多個例程使用分配的記憶體,那么在記憶體被釋放后嘗試使用它更有可能遇到問題。
此外,一旦記憶體被釋放,編譯器可能會將指向它的指標視為沒有固定值。該return t;陳述句不需要回傳任何特定值。
uj5u.com熱心網友回復:
free()指標指向何處并不重要。一旦它是free()d,指標就不再是可延遲的(既不在它所在的函式內部也不在它所在的外部free())
的目的free()是回傳分配的記憶體,malloc()因此語意是,一旦您釋放了一塊記憶體,它就不再可用。
在 C 中,所有引數都是按值傳遞的,因此free()不能更改傳遞給它的值運算式,這就是指標不會更改為無效指標值(如NULL)的原因,但建議您不要再使用指標可以在不引起未定義行為的情況下完成。
在設計中可能有一個解決方案,free()它是通過地址傳遞保存指標的指標變數,因此free()能夠將指標轉換為NULL. 但這不僅需要做更多的作業,而且free()不知道你對malloc()給你的價值做了多少副本......所以不可能知道你在那里有多少參考被取消。這種方法使得無法free()承擔將回傳記憶體的參考設為無效的責任。
因此,如果您認為 free 不會將指標轉換為NULL并且出于某種奇怪的原因您仍然可以使用回傳的記憶體,請不要再這樣做,因為您會犯錯誤。
你被勸告!:)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/314996.html
上一篇:C如何從多個函式回傳陣列?
