1、如何在不知道陣列個數的情況下動態輸入陣列?
答:c語言裡這樣是不行的,只能使用動態分配記憶體。
//c語言
int*a;a=(
int*
)malloc
(sizeof
(int
)*n)
;
//c++
int*a=
newint
[n];
2、c語言的malloc和c++的new有什麼區別?
答:(1)申請記憶體所在位置
new操作符從自由儲存區(free store:凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區,可以是堆也可以是靜態儲存區,這取決於operator new的實現細節)上為物件動態分配記憶體空間;malloc從堆上動態分配記憶體。
(2)返回型別安全性
new分配記憶體成功是返回物件型別的指標,型別嚴格與物件匹配,無需進行型別轉換,故new是符合型別安全性的操作符;而malloc記憶體分配成功返回void*,需要通過強制型別轉換將void *指標轉換成我們需要的型別。
(3)記憶體分配失敗的返回值
new會丟擲bad_alloc異常,而malloc返回null。
int n=10;
int a*=(
int*
)malloc
(sizeof
(int
)*n);if
(a==
null
)else
try
catch
(bad_alloc)
(4)是否需要指定記憶體大小
new無需指定,編譯器會根據型別自行計算;malloc需要顯式指定
(5)是否呼叫建構函式/析構函式
new/delete會呼叫物件的建構函式/析構函式以完成物件的構造/析構,而malloc不會。
new:①呼叫operator new函式分配一塊足夠大、原始、未命名的記憶體空間;②編譯器執行相應的建構函式以構造物件,為其傳入初值;③兌現構造完成購,返回乙個指向該物件的指標
delete:①呼叫物件的析構函式;②編譯器呼叫operator ndelete函式釋放記憶體空間
(6)陣列
c++提供了new[ ]和delete[ ]專門處理陣列;mallo分配時c需要手動定義陣列的大小
a * ptr =
new a [10]
;delete
ptr;
int
* ptr=
(int*)
malloc
(sizeof
(int)*
10);
3、linux程序的五個段:資料段、**段、bss段、堆疊段
答:段(segmentation)是指二進位制檔案內的區域。程序對應的記憶體空間包含5個不同的資料區。
在可執行檔案中,正文段/**段(text segment / code segment)用於儲存指令;資料段(data segment)儲存已初始化的全域性變數,bss段(bss segment)儲存未賦值的的全域性變數所需的空間。
呼叫棧躲在的段稱為堆疊段(stack segment)。它不儲存咋愛可執行檔案中,而是在執行時建立。
所有段均有自己的大小,均不可越界訪問,都則出現段錯誤(segmentation fault),越界會產生棧溢位(stack overflow)。
段名稱作用
bss存放程式中未初始化的全域性變數;屬於靜態記憶體分配
資料段存放程式中已初始化的全域性變數,如static宣告的變數;屬於靜態記憶體分配
**段存放程式執行**的一塊記憶體區域;這部分區域的大小在程式執行前就已經確定,且記憶體區域通常唯讀;**段也可能包含一些唯讀常數變數,如字串常量等
堆(heap)
存放程序執行中被動態分配的記憶體段,大小不固定,可動態擴張。需釋放,否則可能記憶體洩漏導致系統不穩定【tips:windows系統在該程序退出時由os釋放,linux則旨在整個系統關閉時os才會釋放】
棧(stack)
存放程式臨時建立的區域性變數(函式弧{}中定義的變數除static),函式被呼叫時其引數也會壓入發起呼叫的進城棧,呼叫結束後函式返回值也會被存放會棧中
new與malloc的對比總結
c 中的new和c中的malloc都是用來申請記憶體空間的,那麼區別是 new在動態儲存區分配記憶體,malloc在堆上分配記憶體new返回物件型別的指標,型別與物件嚴格匹配 malloc返回 void 通過強制型別轉換成我們需要的物件型別new分配失敗時,丟擲異常,不返回null malloc分配...
malloc函式 new和malloc的區別
1 申請的記憶體所在位置 new操作符從自由儲存區上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。自由儲存區是c 基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體...
new和malloc的區別
1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...