我正在努力處理 C 中可變生命周期的細節(當然)!
我已經了解到我不應該讓在函式??中定義的變數四處浮動,期望為該變數分配記憶體時malloc。我無法解決的是我如何知道指標何時適合從函式中傳遞出去。
在以下示例中,fptr和之間存在根本區別p_uniqueId:
int initialize_db(ToyDatabase* p_tdb, const char* filePath) {
FILE* fptr;
if ((fptr = fopen(filePath, "wb")) == NULL) {
printf("Error! opening file");
return -1;
}
int uniqueId = 2;
int* p_uniqueId = &uniqueId;
p_tdb->pFile = fptr; //Presumably not a dangling pointer, how to tell?
p_tdb->pId = p_uniqueId; //Will become a dangling pointer, not Ok!
return 0;
}
int cleanup(ToyDatabase* p_tdb)
{
fclose(p_tdb->fptr);
//Do I need to do anything else with this fptr? Maybe p_tdb->fptr = NULL;????
return 0;
}
在這個例子中,指向的地址p_tdb->pId在initialize_db函式之外是無效的。但大概p_tdb->pFile是有效的,大概是因為fopen為fptr.
檔案中是否有fopen我正在尋找的描述這兩種情況的內容,或者只是假設任何回傳指標的函式都已被mallocd?
uj5u.com熱心網友回復:
首先,p_uniqueId明確指出uniqueId哪個具有自動存盤類。如果它是全域的、malloc 的、靜態的等等,那么你會沒事的。
我正在尋找的 fopen 檔案中是否有描述這兩種情況的內容,或者只是假設任何回傳指標的函式都是 mallocd?
手冊頁沒有說太多。它只是說FILE*回傳了 a ,您可以安全地使用和傳遞它。它可能不一定是 malloc 的,因為它可能已分配在靜態緩沖區或其他依賴于實作的存盤中。因此,您不能假設它可以安全freed。充其量你留下一個懸空的檔案描述符,因為free對檔案流一無所知。
我發現的有關清理的唯一評論是在fclose聯機幫助頁中:
[呼叫后
fclose]...對流的任何進一步訪問(包括對 fclose() 的另一次呼叫)都會導致未定義的行為。
//Do I need to do anything else with this fptr? Maybe p_tdb->fptr = NULL;????
你不需要做任何事情,本身。您可以p_tdb->fptr理解使用它是 UB。你可以把它歸零。您可以用不同的檔案指標替換它。通過將其設定為 NULL,您可以使用空檢查檢測它沒有指向任何有意義的地方。如果您不檢查它,則在被清零后使用(UB 明智)與在懸空時使用它一樣有害。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/366233.html
標籤:C
下一篇:演算法的結果總是回傳零-C
