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