C C 動態分配

2021-10-07 20:36:08 字數 2079 閱讀 8517

分配失敗,返回空指標

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...