關於c動態記憶體分配這樣寫會不會出什麼問題?char

2021-03-04 00:15:27 字數 5395 閱讀 7165

1樓:匿名使用者

請在new char的時候就寫好申請內

存的大小new char[size], 編譯器並不會從後文或者執行時推斷需要多少記憶體

我沒查到不在裡寫上申請記憶體大小時編譯器會怎麼處理, 看上去應該會報錯才對, 能通過編譯的話我猜可能是當作0或者1或者某個預設值, 總之申請到的記憶體不一定能存得下從cin接收的字串

即使不填上要申請的記憶體大小也能正常執行可能只是char *a指向的那一塊記憶體剛好沒有被用到而已, 從cin輸入的字串足夠長的話多半就會報錯了

c++問題 關於char的動態分配記憶體

2樓:

你程式**邏輯bai

有問題。dustrlen是求字串zhi長,字串必須以'\0'結束,你的字dao符沒有回以這個字元結束,因此求答得的結果是不確定的。不一定是16。下面,給你乙個正確的例子了。

char *a;

a=new char[10];

a[0] ='a';

a[1] ='b';

a[2] ='\0';

int temp=strlen(a); //這時temp的值應該是2。

3樓:匿名使用者

strlen是檢視乙個字串的

長度, 和陣列一點關係都沒有, 只跟記憶體裡面連續的內容有關

傳遞歸給strlen的是乙個記憶體位址

答, 從那個位址往後面看, 到第乙個值為0的位址的距離, 就是strlen的返回值.

傳遞給sizeof的一定是個變數,型別或者陣列名, 當sizeof的是乙個變數或者型別, 則返回該變數和型別的大小, 如果sizeof的是乙個陣列, 則返回這個陣列佔據的空間大小

p.s. 對乙個指向陣列的指標來說, sizeof他並不會返回陣列的大小, 只會返回這個指標的大小, 往往是4個bytes. (根據編譯和執行環境而定)

4樓:匿名使用者

strlen是在執行時求字串的大小,以'\0'為結束符的,由於是動態分配的記憶體,其記憶體的值是不確定的,所以得出16,也有可能是其他的值,這個是不確定的.

sizeof是在編譯時確定大小的.

c++中用new動態分配記憶體的問題

5樓:柳城羽

直接new就可復

以了,不過制c結構體如

bai果定義在.h檔案

du裡,最好加上zhi

dao,避免出錯

#ifdef _cplusplus

extern "c"pos;

#ifdef _cplusplus

}#endif

pos *p = new pos;delete p;

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

6樓:非常可愛

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++預設提供。

7樓:匿名使用者

直接new就可以bai了,不過c結構du

體如果定zhi義在.h檔案dao裡,最好回加上,避免出答錯#ifdef _cplusplus

extern "c"pos;

#ifdef _cplusplus

}#endif

pos *p = new pos;

delete p;

8樓:匿名使用者

注意c++和c的函式

bai庫不同喵~

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

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

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

9樓:小忍and奏

void buildstack(stack *s){(*s).base=(m*)new((&(*s).base) sizeof((*s).

base))char[((*s).stsize 100)*sizeof(m)];

……bai

new(位址du)型別[大小

zhi]

delete &(*s.base) //釋放dao應該

內是這樣容吧

10樓:

比如:pos *p;

p=new pos;

if(!p)

p->i=3;

p->=i*i;...

11樓:匿名使用者

可以用new和delete,和使用普通變數一樣

12樓:粟筠項奇思

c++中是沒有結構抄體的,從baic繼承來的struct已經變成類了,而不再du只是乙個zhi結構體,直接new就可以了。dao

#include

struct

myclass

;myclass::myclass(intarg)

myclass::myclass()

void

myclass::show()

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

13樓:匿名使用者

c++中是沒有結構體的,從c繼承來的struct已經變成類了,而不再只是一

個結構專體,直接new就可屬以了。

#include

struct myclass

;myclass::myclass(int arg)myclass::myclass()

void myclass::show()

c++ 動態分配記憶體 記憶體洩漏問題 new

14樓:匿名使用者

可以,只要對相同位址new和delete配對使用都會正確**記憶體。更好的辦法是使用智慧型指標unique_ptr和shared_ptr。

15樓:無非灬依舊

可以解決,因為申請的指標q已經指向了p申請的這個int例項,delete的話就是把這個動態分配的空間給釋放掉,所以這種方式是可以解決這裡的記憶體洩露問題。

c++用new動態分配記憶體空間賦值的問題

16樓:匿名使用者

scanf("%d",&(*ps)); ps本身就是乙個指標,直接用就可以了,scanf("%d",ps);

你那樣寫ps本身是空的*取值符號取不到資料就錯了。

關於c++動態記憶體分配的問題。

17樓:

這就是java出現的copy理由。

c的指標一直在安全性上被詬病。

不僅是動態分配記憶體,就算是靜態的也存在這個問題。

比如,這段**:

int a[5] = ;

cout << a[6] << endl;

顯然這裡超出了陣列a的範圍,但是很多時候執行並不會出錯,而是輸出乙個很奇怪的數字,因為c++在看到a[6]這句的時候,就是簡單的把a陣列的首位址,加上6乘以資料型別長度,然後把那段記憶體的東西當做int輸出來。

所以在c/c++下寫**要尤其注意指標的問題,因為這些錯誤是很難發現的。

18樓:匿名使用者

肯定存在安全隱患啊,你這屬於記憶體超界了啊。

如果超界的部分還未被使用,那就暫時沒問題而已。

19樓:殳德候寄雲

在c++中不會的,在java中有記憶體自動**機制就可以。

所以,要記得new乙個後就要delete,這樣釋放記憶體,防止記憶體溢位。

20樓:歸會肖巨集遠

不會自動**的哦,記住了。一定要記得用delete。

21樓:聊芳敬帥

intexample(char*

sp)這段**你可以來逐源步除錯到return時候就返回了baidelete不會執行

另外duc++中new分配的空間一定要用delete才能zhi清空這個我以前做過實dao驗的。

c++ 動態記憶體分配的問題

22樓:匿名使用者

ostream &operator<<

這個函式的du問題,你用的不zhi是引用型別,當daomain裡面的cout<後,因為內部的ch需要版析權構,所以checkoutrecord的wait_list會被析構掉。具體你可以看自己的析構方法。

最好不要在vector中放指標,一般人都會用錯。

23樓:匿名使用者

delete*it;

???我記得好像是這樣寫的:

*it=null;

delete [ ]t;

24樓:她去過的地方

嗯,2樓beddy1說的

抄挺有道理襲

在main()中

第一次cout<算符過載函式

ostream &operator<<

由於第二個引數不是引用型別,所以會其呼叫拷貝建構函式,即建立了ch_1和ch_2的拷貝,

兩個臨時的物件,暫時稱為copy_ch1和copy_ch2,問題在於過載函式結束時,

臨時物件copy_ch1和copy_ch2需要被析構掉,而copy_ch1.wait_list裡面的每乙個pair*,和ch1.wait_list裡面的每乙個pair* 是指向同乙個地方的,

悲劇於是誕生了,

臨時物件析構時已經把這每乙個pair*都刪掉了,後面第二次cout<

所以記憶體訪問出錯了!

關於申請動態記憶體來管理學生成績

看到下面的錯誤沒 error c2065 students undeclared identifier 這說明你沒有定義它,其實你在main 函式體內的第一行 student student 這一句改成student students 改了上面的這一行語句,程式可以執行得到想要的效果.不過還是有點問...

C動態2維陣列

理解錯誤 int 就是個int型的指標,sizeof int 是這個指標的大小 在c裡面,指標是預設為int型的,所以sizeof int sizeof char sizeof long sizeof short sizeof int 的.指標還沒有指向乙個已經定義好的陣列,如果是定義好的陣列siz...

c 記憶體管理,C 申請記憶體,若是耗盡系統記憶體,會怎樣

這些是編譯期的靜態資料,不用釋放的。記憶體管理記住乙個原則 誰new的誰delete,誰malloc的誰free.你的兩個例子都不是動態分配記憶體,不用釋放 char a asdfasdfasdf 是定義字串常量是乙個常量 他儲存在靜態儲存區上直到程式結束後系統自動釋放它所佔用的記憶體單元.不需要人...