分配失敗,返回空指標
c:兩個函式malloc()與free()
/*
下面是 malloc() 函式的宣告。
void *malloc(size_t size)
返回的是void *(無型別)指標,故需要對指標做轉換
size:分配的位元組數
*/#include #include #include//malloc()函式需要的標頭檔案
int main()
strcpy(str, "runoob");
/* 重新分配記憶體 */
str = (char *) realloc(str, 25);
if(!str)
strcat(str, ".com");
free(str); //釋放記憶體
return 0;
}
c++:兩個運算子new和delete
對比:new與delete能完成malloc()與free()的功能,並且更為方便和優越
(1)new自動計算要分配的型別大小,不用手動給出要分配的儲存區的大小(位元組數,malloc()需要手動給出),方便且可避免偶然錯誤;
(2)new自動返回正確的指標型別,不用對返回指標做型別轉換;
(3)可用new將分配的儲存空間初始化,呼叫對應的建構函式?
(4)可用new分配乙個物件的儲存空間;
(5)可過載與乙個類相關的new和delete;
(1)格式:
/* var_type * p;
p= new var_type(初始化);//
delete p;
//或 delete p; p指向陣列時的形式
*///動態分配單個資料
int *p;
p= new int(8);//初始化為8
delete p;
//動態分配陣列
float * p;
//p指向陣列第乙個元素位址,該陣列有10個元素,多維陣列時要指明各維度大小
//分配陣列空間時,不可初始化
p=new float[10];
delete p; //釋放分配的陣列空間
//為物件動態分配儲存空間,呼叫建構函式初始化
class test
};test::test(int a,int b,int c)
int main()
delete p; //釋放記憶體
return 0;
}
(2)delete的運算元必須是乙個new返回的指標。對不是new得到的任何其他型別的位址型別,使用delete將會導致嚴重錯誤。這種錯誤是執行時的錯誤,很難除錯。
(3)建構函式和析構函式中含new和delete時,可能會引起指標懸掛以及重複釋放同一塊地址;指向動態分配的同型別指標之間的賦值會引起指標懸掛,要引起注意;
//指向動態位址的指標間的賦值,導致指標懸掛
char* p1,*p2;
p1=new char[10];
p2=new char[10];
strcpy(p1,"sgfjkg");
p2=p1; //由於將p2指向p1指向的位址,p2原指向的位址空間將不可再使用,也無法釋放
delete p1; //釋放p1指向的位址
delete p2; //再次釋放p1指向的位址
//建構函式與析構函式
//原理一致
(4)過載new與delete,與過載其它運算子一致,分全域性過載(全域性中覆蓋原版本new和delete)和區域性過載(只針對特定型別資料型別使用,如類中過載,只對對應類起作用),過載中呼叫了malloc()和free() C C 動態分配記憶體
陣列是最常用的一種資料結構,其缺點是使用時必須確定陣列大小,因此會帶來一些不便 1 需要儲存的資料大小不確定時,預先開闢的空間太小裝不下,太大則浪費空間 2 使用的資料大部分預設儲存在棧 stack 裡,由系統管理,自動分配,自動刪除。但是stack很小,如果讀取的資料很大的話容易溢位。3 系統要等...
mallco動態分配 malloc動態分配多維陣列
下面試自己寫的三個測試程式,如果看懂了基本上動態分配多維陣列就沒什麼問題啦 重點 1 深刻理解多維陣列的概念,多維陣列在記憶體中的分配情況,基本上動態分配也沒什麼問題的。然後還要注意一點的就是,釋放是分配的逆過程!include include include void main void int ...
C C 為什麼使用動態分配?
include include include why1 按需分配,不浪費記憶體 intmain int salary null int n 0 printf 請輸入僱傭人數 scanf s d n scanf s d n if n 1 二.列印 for int i 0 i delete salar...