我可以知道,如果我在 C 編程語言中釋放某些東西并且我之前將其宣告為指標,它只會釋放記憶體但指標仍然存在,否則指標資料型別也將被破壞,如下面的代碼。另外,請問如果我想在這種情況下釋放記憶體,為什么我最后要使用free(list)而不是使用free(tmp)?下面是我的代碼:
#include <stdio.h>
#include <stdlib.h>
int main(void){
int *list = malloc(3 *sizeof(int));
if (list==NULL){
return 1;
}
list[0] = 1;
list[1] = 2;
list[2] = 3;
int *tmp = malloc(4 * sizeof(int));
if (tmp==NULL){
free(list);
return 1;
}
for (int i = 0; i < 3; i ){
tmp[i] = list[i];
}
tmp[3] = 4;
free(list);
list = tmp;
for (int i = 0; i < 4; i ){
printf("%i\n", list[i]);
}
free(list);
}
uj5u.com熱心網友回復:
呼叫free不會影響指標或其內容,只會影響指標指向的內容。但是該指標中的值不應再被視為有效。
free評論中提到了關于您具體使用的部分。
uj5u.com熱心網友回復:
在這些宣告中
int *list = malloc(3 *sizeof(int));
int *tmp = malloc(4 * sizeof(int));
您宣告了兩個指標list,tmp并且具有自動存盤持續時間。指標本身指向動態分配的陣列(陣列占用的記憶體)應該使用函式釋放free以避免記憶體泄漏。
呼叫函式 free 后,指標將具有無效值。
程式所做的是首先動態分配一個包含三個元素的整數陣列,并將分配記憶體的地址分配給指標串列。
int *list = malloc(3 *sizeof(int));
然后程式嘗試通過首先動態分配一個具有四個元素的新陣列來重新分配陣列
int *tmp = malloc(4 * sizeof(int));
如果分配成功,則釋放舊陣列
free(list);
并且新陣列的地址再次分配給指標串列。
list = tmp;
現在是兩個指標list和tmp指向同一個動態分配的陣列。您可以使用任一指標來釋放分配的記憶體,但從邏輯上講,最好使用指標串列,因為程式模擬重新分配最初由指標指向的陣列list。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/406180.html
標籤:
上一篇:使用偏移量訪問結構成員char*
