肯定會釋放了,函數調用完成后,函數里的所有局部變量將會被釋放。但是你寫的這個程序根本就有問題。你所返回的只是一個地址空間,所以一直沒變,釋放指的是將這個地址里的內容清除掉,以便使其它的數據可以用這個地址的內存。如果沒釋放的話,其它的數據就用不了這個址址了。
尼木網站制作公司哪家好,找創新互聯建站!從網頁設計、網站建設、微信開發、APP開發、成都響應式網站建設公司等網站項目制作,到程序開發,運營維護。創新互聯建站從2013年成立到現在10年的時間,我們擁有了豐富的建站經驗和運維經驗,來保證我們的工作的順利進行。專注于網站建設就選創新互聯建站。
c的內存泄露主要是出在指針上面。對于變量,系統都會在用完后自動釋放的。
變量釋放就是告訴系統你不用這塊地址了,別的程序可以對那塊地址進行賦值等操作,因此那塊地址的值你就不可控了,即使你再對它賦值,也可能被別的程序改變,產生意想不到的結果。
只要訪問過p指針,都會變化(連續printf兩次,結果不一樣)
f函數結束,p指向地址已經釋放,但是該內存單元依然存有原來的數據,我個人認為,訪問p之后,由于一些系統內部操作,導致p指向內存單元被回收,內部機制不清楚,純屬個人猜測
1、當成普通數組使用,用for循環即可賦值。
2、例程:
#include
#include
int
main(void)
{
int
*a=NULL;
int
i;
a=malloc(sizeof(int)*10);/*動態創建一個有10個int元素的數組*/
if
(a==NULL)
{
/*a==NULL表示空間分配失敗*/
fprintf(stderr,"MEMORY
ERROR");
return
-1;
}
for
(i
=
0;
i
10;
i++)
{
a[i]=i;
/*對數組進行賦值操作*/
}
free(a);/*動態分配的空間需要用free()函數釋放*/
return
0;
}
p最開始賦值為NULL,可以把他拿到函數test中又被重新賦值為指向變量a,而指針作為函數參數的時候是直接改變內存中他指向那個位置的值,你說的a確實被釋放了(這個可以在主函數中test(p);下面調用一次a,會報錯說a沒定義,說明a已經被釋放了),但是賦值給指針p的那段地址還在那,并且那個地址里面存放的值是45,所以在最后輸出p指向的位置的值的時候就把45輸出了。
n = scanf("%d",n);
這一句有問題
1. scanf 函數是有返回值的,它的返回值可以分成三種情況
1) 正整數,表示正確輸入參數的個數。
例如執行 scanf(“%d %d”, a, b);
如果用戶輸入”3 4”,可以正確輸入,返回2(正確輸入了兩個變量);
如果用戶輸入”3,4”,可以正確輸入a,無法輸入b,返回1(正確輸入了一個變量)。
2) 0,表示用戶的輸入不匹配,無法正確輸入任何值。如上例,用戶如果輸入”,3 4”,返回0。
3) EOF,這是在 stdio.h 里面定義的常量(通常值為-1),表示輸入流已經結束。在Windows下,用戶按下CTRL+Z(會看到一個^Z字符)再按下回車(可能需要重復2次),就表示輸入結束;Linux/Unix下使用CTRL+D表示輸入結束。
你這個輸入一個返回值就是1,因此n也會一直等于一