c 中進行動態記憶體分配後怎麼儲存該記憶體中的資料呢

2022-12-28 18:31:07 字數 6048 閱讀 4631

1樓:

c語言中動態分配和撤銷記憶體採用malloc和free,c++中採用new和delete,雖然c++相容c,也可以用malloc和free,但他們是庫函式,而new和delete是運算子,執行效率要高,所以建議c++中記憶體分配用new和delete。

如果記憶體申請成功,new運算子返回一個指向所申請的記憶體空間首地址的指標,申請失敗則返回null(不同編譯器處理方法可能不同)。

如 int *p1 = new int;

float *p2 = new float(3.14159); //申請記憶體並初始化

char *p3 = new char[10]; //陣列

stu *p4 = new stu; //stu為已定義的類

delete p1;

delete p2;(釋放整個陣列空間)

動態申請的記憶體沒有名字,也不知道其地址,但它確實是存在的,通過指標來訪問。

如 *p1 = 100; 這和普通變數一樣使用,如果要斷電儲存,那就要寫檔案或者資料庫了,可以查詢相關係統函式。

2樓:匿名使用者

一般動態申請的記憶體,當程式結束以後就會釋放掉。

像這種情況如果特別的想儲存記憶體中的資料,就需要寫檔案儲存到硬碟或者其它儲存介質上。

當程式再啟動的時候,想用這些資料就可以從盤上讀出來再接著使用。

3樓:匿名使用者

你是指儲存到硬碟上?

c++ 怎麼讓陣列動態的分配記憶體來儲存.?

4樓:匿名使用者

首先對於你的問題明確一下:

第一:你是說自己寫一個動態分配的資料麼?如果是那樣的話,你使用c中malloc和realloc,然後使用free釋放,方法一樓已經說過,不多說了;

你也可以使用c++中的new和delete,new和malloc基本差不多,但是new和delete是c++中的,對用類使用的話,new會呼叫類的預設建構函式,delete會呼叫類的解構函式,malloc和free不具上述功能。

第二:如果你說的是動代陣列的話,c++標準庫,也就是stl中有,陣列是vector,連結串列是list

vector和list都是自動增長的,也就是自動分配記憶體的,不用你管,只管使用即可,對於vector和list的實現,是由標準庫的牛人實現的,就如同呼叫c中的abs函式一樣,abs是c標準庫中的函式,實現也是有標準庫的大牛實現的,我們只管使用;對於stl的原理有很多書講解,如果有興趣可以看看相關書籍,比如:《c++ 標準程式庫》、侯捷同學的《stl原始碼剖析》等,如果瞭解標準庫的使用的話,《c++ primer》等很多書籍中也都有講解;

對於vector簡單介紹兩句吧:vector 使用的了c++中的模版機制,定義了一套對應的介面函式進行操作;

例如定義一個放置unsigned int型別的陣列:

#include

typedef std::vector< unsigned int > uintarray;

uintarray m_arraya;

迴圈從陣列最後新增10個元素:

unsigned int untmp, uncount = 0;

for( untmp = 0; untmp < uncount ; untmp++ )

刪除所有元素:

m_array.clear();

還有很多函式,以及iterator。

不知道我回答的是不是你問的,不過希望你以後提問題,描述清楚一些,讓解答人能明確你的問題!

5樓:匿名使用者

1、使用malloc函式,先分配第一維的大小,然後再迴圈分配每一維的大小。

2、例程,分配3行4列二維陣列:

#include

#include

int main()

//初始化

for (i = 0; i < 3; ++i)}//輸出測試

for (i = 0; i < 3; ++i)printf ("\n");

}//釋放動態開闢的空間

for (i = 0; i < 3; ++i)free(a);

return 0;}/*

輸出:0 1 2 3

1 2 3 4

2 3 4 5*/

6樓:融斯力穎慧

假設你的資料時int型的。

int*p

=null;

intn;scanf("%d",&n);p=

malloc(n,

sizeof(int));

//這樣分配了n個int型資料的空間,並且p指向空間首地址排序那個就自己採用一種排序方法吧。操作p可以說是跟操作一個陣列一樣的p[0]就是第一個元素。p[n-1]就是陣列最後一個元素。。

最後呼叫free(p)釋放掉申請的記憶體

7樓:匿名使用者

陣列的大小,c與c++應當都是固定的。

只不過指標可以用malloc和realloc進行擴容。

如int *p=(int *)malloc(10*sizeof(int));

p=(int *)realloc(1000*sizeof(int));

8樓:

c語言中陣列也一樣可以通過動態分配得到

用malloc(個數*sizeof( ))calloc(個數,sizeof( ))都可以

9樓:匿名使用者

int *ary=null, *pa;

int n;

pa=new int [n];

這樣就可以了

10樓:匿名使用者

t;>n;

int **arr = new int*[m];

for(int i=0; i

c++動態記憶體分配後必須檢查記憶體分配是否成功嗎

11樓:

最好進行分配是否成功的判斷!否則如果不進行此判斷,一旦分配失敗,你的程式還當做分配成功操作,就會出現對空指標進行操作的異常!

當某一個程式佔用記憶體很大,大到每一塊記憶體都被標記為正在使用,這是再進行申請記憶體肯定會失敗!所以只有判斷了才不至於你寫的程式出現錯誤!

有一種測試程式可以出現分配失敗的情況!比如寫個死迴圈,然後進行記憶體分配,肯定會出現失敗的情況!

12樓:匿名使用者

書上說的是一種良好的變成習慣。當你編寫一個很大的程式,比如資料庫之類的。很可能會耗盡當前記憶體。所以每次都需要檢查是否分配成功。

你可以用斷言來代替if判斷。

assert(p != null);

13樓:

thinking in c++上講過,對於c++中的new操作符,是不用檢查的。c語言則需要檢查。

c++裡面使用動態分配記憶體,建立某個類的物件陣列。。如何呼叫帶引數的建構函式?。。

14樓:匿名使用者

既然類裡沒有其它函式的話,你可以把那些要輸入的成員定位protected類或public類,在類外呼叫輸入就ok了。

15樓:匿名使用者

建構函式有個初始化列表 你可以在分配的時候把資料傳輸給成員函式

16樓:匿名使用者

你可以寫一個新增的函式在類裡,然後迴圈輸入

17樓:匿名使用者

你可以輸入以後再拷貝到陣列裡去(operator=),因為定義物件陣列時就必須初始化每個物件,所以

student = new student[n];

這一句實際上已經呼叫了每個物件的無引數建構函式,如果你沒有提供一個無引數的建構函式那麼這個句子會報錯

另一種方法是

student** student;

student = new student*[n];

// 輸入第i學生的資訊

// student[i] = new student(構造引數);

這樣就可以實現你說的輸入以後再根據輸入資訊構造了

c++裡使用動態分配記憶體,如何呼叫帶引數的建構函式?

18樓:常山趙子龍

myclass a:定義一個物件,呼叫1次建構函式。

b[2]:定義含有兩個元素的陣列,實際上定義兩個物件,所以呼叫2次建構函式。

*c:定義指向類物件的指標,但沒有進行實際的記憶體分配,所以不呼叫建構函式。

**d:定義指向類物件指標的指標,但沒有進行實際的記憶體分配,所以不呼叫建構函式。

*e[2]:定義含有兩個指向類物件的指標的陣列,但沒有進行實際的記憶體分配,所以不呼叫建構函式。

*f=new char a:這個語句有問題,f是指向myclass的物件,你卻讓它指向char型別的變數。應該改成:

*f=new myclass,涉及到記憶體的分配,呼叫1次建構函式。

*g=new myclass [2],涉及到記憶體的分配,呼叫2次建構函式。

總結:只有涉及到記憶體分配的時候,才會呼叫建構函式。普通物件呼叫一次,物件陣列呼叫n次(該陣列含有n個元素)。只定義指標而不給指標賦值,則不涉及記憶體分配,不呼叫建構函式。

c++是c語言的繼承,它既可以進行c語言的過程化程式設計,又可以進行以抽象資料型別為特點的基於物件的程式設計,還可以進行以繼承和多型為特點的物件導向的程式設計。

c++擅長物件導向程式設計的同時,還可以進行基於過程的程式設計,因而c++就適應的問題規模而論,大小由之。

c++不僅擁有計算機高效執行的實用性特徵,同時還致力於提高大規模程式的程式設計質量與程式設計語言的問題描述能力。

c++動態記憶體分配一維陣列

19樓:匿名使用者

你的兩個疑問:

1、分配記憶體大小如何確定

2、動態分配記憶體後初始值是啥東西

給你一個簡單的解決方案例子:

1、定義一個函式,兩個引數,引數1(指向記憶體的指標),引數2(記憶體的大小)

2、為你分配的記憶體做初始化消除不確定性

20樓:帥的人正在使用

首先引入標頭檔案include

然後建立動態陣列 vectorvec ;

寫入資料 vec.push_back(....)拿到資料 可以通過迴圈編輯 vec[i]也可以每次拿到頭第一個 vec.front()歡迎追問,望採納

21樓:人人順風順水

暈,如果什麼都搞不定就學一學用vector

c++中給結構體分配動態記憶體的問題……用new嗎 怎麼用?

22樓:非常可愛

c++中給結構體分bai配動態du記憶體是用new。

示例:struct mystruct

mystruct *pmysrt=new mystruct;

pmysrt->a=1;

pmysrt->b='a';

cout

擴充套件資料zhi

c++中new的用法

dao1、呼叫operator new分配記憶體,operator new (sizeof(a)) ;

版2、呼叫建構函式生成權類物件,a::a() ;

3、返回相應指標 ;

4、分配記憶體這一操作就是由operator new(size_t)來完成的,如果類a過載了operator new,那麼將呼叫a::operator new(size_t ),否則呼叫全域性::operator new(size_t ),後者由c++預設提供。

23樓:匿名使用者

注意c++和c的函式

bai庫不同喵~

realloc 只是du 「從操zhi作dao系統中分配記憶體給回當前程序」

new 預設答包含「從作業系統分配記憶體給當前程序,並使用建構函式初始化該記憶體區域」 兩個操作。

如果只是想要在c++裡面編譯通過,加上 extern "c" {} 關鍵字註釋c**塊即可喵。

如何在小學數學教學中進行分層教學

小學三年級前不分層,之後可根據前三年學習成績綜合排名,可以不同學科分層教學 如何在小學數學中進行分層教學 在小學數學教學實踐中,很多教師都為班級學生數學水平參差不齊造成統一授課的效率低而無可奈何。本文重在闡述如何在教學實踐中對學生科學地分層並實施分層授課 分層練習 分層輔導,以使每一個學生都能接受應...

thinkphp中進行聯表查詢該怎麼寫

親,聯表查詢可bai以參du考這裡呢 zhi手冊 如有不懂可繼續dao追問專,希望可以幫助屬到你 只需要用到 baijoin方法即可 du以thinkphp5為例zhi db table think artist alias a 給主 表取別dao名 join think work w a.id w...

C 動態增加陣列長度,c 動態定義陣列長度

1.你可以設立一個指標intpointer 指標和陣列本來就是一家人 int intpointer 然後當取得了i的值後用 intpointer int malloc i sizeof int int main 用new 陣列長度給定後。如果想增加。只能重新分配空間。儲存元素,然後在進行刪除 用re...