當前位置:首頁 » 編程語言 » c語言內存問題
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言內存問題

發布時間: 2022-01-13 06:56:17

『壹』 c語言內存空間的問題

字元串佔用位元組為:有效長度+1個位元組。
因為字元串尾部有一個\0

『貳』 c語言關於內存釋放問題

是InitStack(s)吧?程序里就沒有InitSqlist()。
因為棧內容沒有初始化,所以訪問那個s->top時就出錯了,並不是分配內存的malloc的問題。
把主函數里這兩行改一下:
Stack *s; /* 這里沒有給s分配內存,這只是一個Stack的指針*/
InitStack(s);
改為:
Stack s; /* 這樣就給s分配空間了, s.top現在就可以用了*/
InitStack(&s);
這個問題就好了。

相應地,以後使用棧時注意使用指針就好:
ShowStack(s);
改為
ShowStack(&s);

還有一種做法,就是在:
Stack *s;
InitStack(s);
中間給指針s分配內存,讓指針s指向正確的結構:
Stack *s;
s = (Stack*)malloc(sizeof(Stack));
InitStack(s);

『叄』 c語言內存使用問題

補充一下:樓主說的「泄露」是錯別字,本為「泄漏」,這下你再看應該好理解了吧。

================================================

1: 因為使用 static 聲明的變數在全局中只有一個實例,也就是說如果你這樣用的話:
char * a = itoa(10);
char * b = itoa(9);
之後,實際上 a 和 b 指向的是同一個 static 數組,它們當前值都是 "9"。

2: 內存泄漏說白了就是你使用了 new 在堆中創建了內容,而使用之後沒有使用 delete 將之前申請的內存釋放,這樣申請的內存就算沒有指向它的指針(也就是再也沒有調用的時候),內存也依然被佔用,這就是內存泄漏
他的方法就是叫你每次調用這個 itoa 的時候 new char[20] 這個樣子。這樣的話你不知道什麼時候應該把內存釋放掉,很容易造成內存泄漏。

舉個例子:
char *itoa (int n)
{
char* retbuf = new char[20];
sprintf(retbuf, "%d", n);
return retbuf;
}

然後你調用
char * a = itoa(10);
如果要使這段內存脫鉤之前不先釋放:
delete [] a;
然後使他脫鉤
a = itoa(9);
那麼第一次調用的時候 new 出來的內存就泄漏掉了。。

『肆』 c語言中內存問題

0xae34bcdf 是個16進制常數

%x %lx 都是表示操作數據按16進制進行處理
所以,輸出就是這樣子,不知道你所說的情況是這個嗎?

『伍』 用C語言分配開辟內存問題

你的代碼不是C的,其實現在語言比較強大,也許在內存回收上做了完善,我不會C++,我知道JAVA語言,他本身在內存回收上面做了優化,就是在堆中申請的內存,操作系統沒回收,但JAVA語言最終編譯成可運行碼的時候,回收了這塊內存(JAVA的垃圾回收機制,蠻強的,不過我不太喜歡)。你可以試試用C寫,用malloc 來申請,這個應該不會被回收的,你可以試試,當然可能和其它原因有關。

最後如果你想學習內存管理的話,方向是:操作系統理論中的頁式內存管理,地址的印射這2部分是理論(比較簡單,實際情況比這復雜一點,先看理論比較好)
等真的明白了(應該不難懂),下面就有難度了,選一個比較流行的CPU的地址映射(各種不同的CPU地址映射是不一樣的),我看的是intel 80386後出現的保護模式(其實是286後出現的,不過286沒什麼名氣),以及linux中內存管理的源代碼(記得結合書看,直接看代碼很難懂)。
==========================================

你的問題算是有點難度和深度的。

關於內存開辟問題,在linux中有個很特殊的內存段,它的大小是8K,我們叫他系統堆棧空間,任何一段程序代碼在運行時候它都是一個進程,它都會有這么一個8K的系統堆棧空間。局部變數都是放在這樣一個8K空間中,包括int a,int a[100], int *a.他們都放在這里。

那麼第一個問題就回答了,int a就是放在系統堆棧空間中。當這個進程死亡的時候,會有其它的進程來回收這個空間(它自己會指定的,一般是其父進程),所以你不需要自己手動去釋放局部變數佔地內存。

至於int * a;然後你new一個空間這個就有點不同了,首先 * a還是個局部變數,他是存在於系統堆棧中。不過它存的比較特殊是一個邏輯地址,不是一個值(其實邏輯地址也就是一個無符號的16位整數而已)。當你new 的時候,會在堆空間中開一個空間,並把這個空間的地址放到剛那個 a中去。很明顯新申請的空間不是在系統堆棧空間中,父進程(一般是)是不會回收這個內存的,這就是為什麼你要自己 free(a) 這樣來釋放空間。

我們常說局部變數不要過大,比如int a[10000]這是不允許的,可以看出來只有8K的大小的內存,而且他還不全部都是給局部變數使用,他有相當一部分內存是給進程式控制制塊和中斷返回現場用的(讀過linux源代碼你就清楚了),另外C語言不檢查數組邊界,如果你int a[4]數組,而不顧一切的向這個數組上放東西,你就有可能很運氣的把中斷的返回地址給沖掉,聰明的人會放一個新的返回地址進去,而這個地址返回一個惡意的進程。知道會發生什麼了,這就是緩沖區溢出攻擊。

windows雖然不太一樣,但原理差不多。

『陸』 C語言 內存的問題

一個由c/C++編譯的程序佔用的內存分為以下幾個部分
1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變數的值
等。其操作方式類似於數據結構中的棧。
2、堆區(heap) — 一般由程序員分配釋放, 若程序員不釋放,程序結束時可能
由OS回收 。注意它與數據結構中的堆是兩回事,分配方式倒是類似於鏈表,呵呵。
3、全局區(靜態區)(static)—,全局變數和靜態變數的存儲是放在一塊的,初
始化的全局變數和靜態變數在一塊區域, 未初始化的全局變數和未初始化的靜態
變數在相鄰的另一塊區域。 - 程序結束後有系統釋放
4、文字常量區 —常量字元串就是放在這里的。 程序結束後由系統釋放
5、程序代碼區—存放函數體的二進制代碼。

所以你說的1不正確
2 文字常量區和代碼區是獨立,代碼區存放編譯後的代碼 文字常量區 存放 字元串常量
比如char *p="123455"; 那這個「12345」就放在文字常量區 這個區域不能修改 p指向的內容不能修改

3malloc申請和new申請的在同一個位置 叫堆區 也叫自由存儲區
4 malloc等

5解釋是const申明的變數 如果不需要地址 編譯器會給它優化 把它作為一個常量替換掉出現該變數的地方 比如const a=3;
後面 b=a+b; 編譯器直接處理成
b=3+b;

『柒』 c語言內存問題

如果是用malloc等函數獲取的內存空間,需要自己調用相關函數釋放;其他對象的生命期由編譯器管理,生命期結束後自動釋放……

『捌』 c語言,大概是內存問題

函數局部變數不會自動初始化,需要軟體初始化,如果不初始化,它的值是個隨機數,是個不確定的數據,因為局部變數所在的內存空間是由系統來隨機分配的,而這段內存有可能被其他程序使用過,所以裡面的值是不確定的。
%s 只是個格式說明符,跟string.h 沒有關系吧。

『玖』 C語言中變數內存問題

(1)在函數中申明的變數,是局部量。
(2)函數沒有被調用時,不給局部量分配空間。此時不佔用內存空間。
(3)函數 局部量的生命周期是從調用開始到調用結束。
只有在調用函數時,才臨時分配空間,函數調用並執行完畢時,空間就會被釋放。
函數調用和執行中,無論是否使用此變數,它都要佔用內存空間,有地址。
(4)更精確地說,同變數所在的域(就是一對花括弧之間的區域)有關,生命周期從進域開始到出域結束。

『拾』 c語言程序運行時 內存問題

以程序的具體執行過程為例來給你講解,但願你能理解:
1.程序被打開時,即程序開始運行時,會首先向操作系統請求獨占內存空間(一段在程序整個執行過程中都不釋放的空間),操作系統會應答請求並分配一段邏輯上連續(其實是將零散的內存空間映射為一段連續的空間)的內存空間給該程序,此時程序得到該段空間的邏輯地址信息,根據地址將程序代碼段和數據段裝入內存,此時程序載入完成。
2.程序運行中,當某一過程任務需要更大內存空間時,會再次向操作系統發出請求,操作系統會根據請求再次分配內存空間給該程序,當這一過程任務執行完畢後,該內存空間被釋放。同時由於操作系統的存儲保護,程序在運行過程中只能訪問自己所申請的內存空間,不能訪問其他程序的內存空間。
3.當程序執行完畢或關閉程序後,該程序所佔的所有內存空間都被釋放。
當你再次打開程序後,重復上面的過程。
下面對你的問題進行針對性回答:
1.當程序運行時,會調入內存,不同時間運行,程序放在內存的位置也可能不同:每運行一次程序,程序都會重新向操作系統申請內存空間,這時操作系統會分配一段全新的內存空間給程序,故不同時間運行程序,程序在內存中的位置是不同的。
2.使用內存中數據的位置也可能不同:當程序申請內存空間後,操作系統會將所申請的內存空間的地址傳給程序,盡管數據的位置不同,但程序知道數據的地址,故程序依然可以根據地址來找到所需要的數據。