C語言問題 用malloc申請記憶體

2022-12-21 02:15:16 字數 5965 閱讀 6161

1樓:匿名使用者

1. 你寫的是c程式吧?c程式裡沒有引用的,不知道你編譯的問題有沒有出在這裡void build(l & l) ,你說編譯有問題,就把編譯的錯誤也帖上來。

2. 你的主要問題應該出在這裡

l2.d = (int*)malloc(2 * sizeof(l.d));

sizeof(l.d)這個是不會得到你d指向記憶體的大小的...為什麼不直接用你那個d_lenth的值?其他地方我沒有注意到有什麼,你改了以後試試看吧,我沒有編譯器,沒法執行。

2樓:匿名使用者

如果是順序表,我建議你先malloc兩倍的記憶體,把原來的記憶體的內容拷貝到新記憶體,再釋放老記憶體,這樣應該沒有問題的

還有把你的程式貼上看看吧

3樓:

你的這個程式寫的太不規範了,該退格的沒有退,該換行的沒有換,真是的,修改都不好修改,當然我不是說你寫的程式差,水平不高,也沒有自誇自己水平高,其實要當程式設計師就要養成好習慣,把程式寫工整些,自己看起來也舒服,別人修改也舒服.你說呢??

如果認為我說的不對,那就當我沒有說過吧.

如果認為我水平差,到我空間看看又何妨呢??相信不會讓你失望...

c語言中使用malloc分配記憶體後沒有**,有辦法解決麼?

4樓:匿名使用者

7.5 free 和 delete 把指標怎麼啦?

別看 free 和 delete 的名字惡狠狠的(尤其是 delete) ,它們只是把指標所指的記憶體給

釋放掉,但並沒有把指標本身幹掉。

用偵錯程式跟蹤示例 7-5,發現指標 p 被 free 以後其地址仍然不變(非 null) ,只是

該地址對應的記憶體是垃圾,p 成了「野指標」 。如果此時不把 p 設定為 null,會讓人誤

以為 p 是個合法的指標。

如果程式比較長,我們有時記不住 p 所指的記憶體是否已經被釋放,在繼續使用 p 之

前,通常會用語句 if (p != null)進行防錯處理。很遺憾,此時 if 語句起不到防錯作用,

因為即便 p 不是 null 指標,它也不指向合法的記憶體塊。

char *p = (char *) malloc(100);

strcpy(p, 「hello」);

free(p); // p 所指的記憶體被釋放,但是 p 所指的地址仍然不變

… if(p != null) // 沒有起到防錯作用

示例 7-5 p 成為野指標

7.6 動態記憶體會被自動釋放嗎?

7.7 杜絕「野指標」

7.8 有了 malloc/free 為什麼還要 new/delete ?

7.9 記憶體耗盡怎麼辦?

7.10 malloc/free 的使用要點

7.11 new/delete 的使用要點

7.12 一些心得體會

參考文獻:

高質量 c++/c 程式設計指南 - 林銳 2001

5樓:記住一座城

養成好習慣,在堆上分配的記憶體不用的時候要記得釋放,不然它們佔據的空間會越來越大,

另外,儲存好指標的值,否則可能永遠都釋放不了了。

當你用free釋放一片記憶體之後,作業系統可能不會真正的收回,當你下一次用malloc分配記憶體的時候如果大小剛好,它會把你剛釋放掉的記憶體分配給你。

當程式結束後,作業系統會**所有程式所佔用的記憶體空間,包括堆,資料段,**段等。

6樓:匿名使用者

malloc()分配後,當不再用到的時候記得用free()去釋放記憶體,否則會一直佔用記憶體,導致記憶體洩露,最後記憶體越來越少。重啟機器後記憶體會釋放。

7樓:

程式結束 自己沒. 用不著怕

除非你一直開著那個申請記憶體的程式.

不然等你關了程式, 系統會自動**他所申請的資源

8樓:匿名使用者

不用管 程式執行結束,作業系統會自動**提供給該程式的資源,

但是有些程式可能會一直執行下去,因此要求不要忘記用free釋放記憶體

c語言「堆」申請為什麼用malloc函式,用陣列不行嗎?

9樓:匿名使用者

在所需記憶體大小已知的時候也可以用陣列申請,malloc函式用在其大小在執行時才確定的情況,此時就無法用陣列來做了

堆是用來存放資料的,使用堆為了讓cpu可以找到相應的資料,如果自由分配,cpu無法確定這是程式還是資料,是什麼型別的資料

10樓:匿名使用者

這個涉及兩個儲存區域,堆和棧,你用malloc申請的空間在堆上,char a[10]這個是在棧上。

堆和棧最重要一個區別是,棧是系統管理的的,他負責**和釋放,所以有個概念叫作用域,變數的作用域一結束,棧就**變數的資源。但是堆是程式設計師管理的,你不釋放,除非程序結束,這個空間就一直在那,就有了一定靈活性。

回答了申請堆的作用。

堆在實現的時候確實是在底層是連結串列的形式沒錯,棧是連續的空間。

c語言,用malloc為結構指標申請記憶體失敗

11樓:

這個看不到**沒法說啊

一般malloc失敗要麼是分配的記憶體太大(這個一般不會發生其實……)要麼是malloc過於頻繁導致沒有複合大小的連續區域(只是連結串列struct的話應該也不至於)

再有麼要麼就是malloc前後的操作中有越界?

12樓:匿名使用者

把**貼上來看看,還是有哪塊寫得不對

c語言malloc無法分配記憶體

13樓:風若遠去何人留

動態分配的記憶體是不可以通過sizeof來確定大小的。或者說 所有的指標型別都不可以。

sizeof的結果是指標本身的大小,對於32為編譯器,都是4

只要你malloc的返回結果不是null,這個記憶體就可以放心的用了。

14樓:匿名使用者

如果你用指標來申請記憶體空間,malloc(p),指標的型別要定義成結構陣列的型別,

比如:struct stu *p;

ptr = malloc(p);

如果你直接申請空間,malloc(100),malloc需要強制轉換成你的結構型別。

比如:ptr = (struct stu *)malloc(100);

這樣才能正常申請到空間。

15樓:匿名使用者

.......指標在32位下就是4位元組。你還不知道指標是什麼。基礎很差!

其實你是想看看到底有沒有分配夠這麼多記憶體給你。其實只要判斷指標 指標 != null 就可以了。因為只要分配成功就肯定一樣大。分配失敗時返回 null

c語言,怎麼用malloc申請一個100000個變數的字串陣列?

16樓:匿名使用者

這是一個二維陣列,所以要定義一個二維指標才能完成相應的操作

char **m ;

m = (char**)malloc(sizeof(char *) * 100000); //行數

int i=0;

for( i=0;i<100000 ;i++ )接下來,就和使用二維陣列一樣的操作m了,如:

strcpy( m[0], "hello" );

m[0][0]= 'h' ;

17樓:匿名使用者

可以通過以下語句實現:

char *p; //定義指標變數

p = (char *)malloc(100000);//申請空間並賦值給p。

解析:malloc為記憶體分配函式,其定義為void * malloc(size_t size);

功能為申請size大小的記憶體長度,並返回分配到的地址值。

而字元型別,每個元素佔1個位元組空間,所以100000個變數的總空間就是100000位元組,於是引數size為100000。

18樓:匿名使用者

#include

#include

#include

using namespace std;

// 申請的arr空間類似: #代表point *代表data; 那麼他就是一個 4行5列的資料

//  #***** #***** #***** #***** //這是本來應該儲存的形態

//  ####***** ***** ***** ***** //這是我們寫出來的結構 那麼解釋一下

// 第一個# 即頭指標arr, 第二個# 他指向了第第二組的頭 即第二行的首元素 第三個#指向了第三行的首元素 第四個#同理

// head即第一個*的位置

//  二維陣列 arr[i][j] 等價於 * ( arr + i ) + j; 又等價於 arr[i] + j; ( 此處arr[i]代表地址 )

template < typename type >

type ** new_array_2d( int row, int col )         //row是行 col是列

// this指標即為date -> func() 等價於 func( &date ), 隱含傳遞了this;

}           // 現在arr[i][j] 的地址即為這個資料的指標

}return ( type ** ) arr;               //返回這個陣列頭指標

}template < typename type >

void delete_array_2d( type ** arr, int row, int col )      //釋放二維陣列 row行 col列

}if( arr != null )

}int main()

}for( int i = 0; i < nrow; i++ )             //輸出二維陣列

cout << endl;

}delete_array_2d< string >( p, nrow, ncol );        //釋放記憶體

system( "pause" );

return 0;

}你申請的是一維的 你想要的是二維的 當然報錯

19樓:修和玉於旋

這是以前我寫的**,字串存在buffer指標所在的緩衝區中intreadbuffer(char

**buffer)

free(buftemp);//釋放

buffer[buf_totalcount-1]='\0';

//填充結束符

returnbuf_totalcount-1;//返回實際字串的長度

}希望對你有幫助

c語言 malloc()函式 分配記憶體空間尺寸的問題

20樓:王斌隨

這個問題首先得從堆疊說起,一個程式一般分為三段:**段,資料段(靜態資料),和堆疊段。堆疊段儲存程式中的變數、程式傳遞的引數等(動態分配的變數儲存在堆中,靜態分配的儲存在棧中)。

堆疊的增長方式如下:

程式在執行的時候會預先分配堆疊空間,所以你的問題中不一定修改了不該修改的地方,有可能那裡本來就是空的。

再回到malloc這個函式上來,malloc主要負責分配空間,返回該空間的首地址。那為什麼申請空間為0,卻可以儲存7個字元呢?那是因為c語言的指標中並不檢查陣列的越界問題,不信的話,你可以這樣:

char ch[5],然後你去讀寫ch[6](printf或scanf),這樣是不會報錯的。但是我們在使用的時候,千萬別越界使用,因為這樣的程式是非常危險的,試想,如果越界使用的地址正好是一個作業系統的地址,那麼你一修改,系統就崩了。同時,c語言的這個機制被黑客廣泛地應用與緩衝區溢位攻擊,所以你非但不能越界使用指標,還得時刻考慮到指標(陣列)是否越界,以加強程式的安全性。

希望對你有所幫助。。。

C語言問題C語言問題,C語言問題C語言問題

include include int main b k p b k 0 puts b return 0 c語言問題c語言問題 include int main int h,m scanf d d h,m printf s num h if m 0 else printf o clock print...

C語言問題,C語言問題C語言問題

這題考的是自動型別轉換,由編譯系統自動完成,轉換是 向上 靠的 舉個例子 include stdio.h void main 你編譯一下就會有警告 conversion from double to float possible loss of data 也就是說系統預設轉化了a,b的資料型別為do...

c語言問題,C語言問題

1 c2 a 3 d4 a 5 d6 b 7 a8 a9 d c語言問題 include define n 30 typedef struct student student r n int main void num 1 for i 0 ir max score max j if max i if...