1樓:匿名使用者
看來你一定是個初學者。當你需要成千上萬的資料時你能像inta=5;int*p;p=&a;一樣定義那麼多數嗎?int*p;p=(int*)malloc(100*sizeof(int));實桐答激際上可以理解為宣告瞭乙個p[100]的int型陣列,你怎麼用陣列就怎麼用p的個指標。
那麼為什麼不直接inta[100]這樣宣告呢?當然可以,這得從兩方面說明:1.
當局襪你知道用多少個資料時,用inta[100]要比用malloc那樣方便得多,但很多時候是不知道需要多少資料,要根據需要臨時輸入資料個數再宣告陣列——這就有問題了:c是不允許用變數做陣列的宣告大小的;若儘量往大里安排,那麼你事先安排了2000個資料空間,而大部分舉蔽時候卻只使用10個,那不是對很有限的存存空間的無謂浪費嗎?這樣宣告的空間在棧上;棧相對較小,宣告太大的陣列是放不下的,比如sz[2000][2000]在很多編譯器下是不成功的。
而用malloc宣告的空間在堆上,那裡很大很大,可以安排很大的資料量。使用malloc建立的指標p是可以指向別處的,不像你說的不能再p="123"了。但你不能這樣做,因為在堆上分配空間是永久性的,必須人工釋放,你讓它的指標指向別處了,那分配的空間就找不到了(因為空間頭指標是唯一記號),可是它還在那裡放著釋放不了;累積多了就把內在消耗光了——這叫內在洩漏!
所以,用了p=(int*)malloc(100*sizeof(int));完了必須得用free(p);來釋放分配的記憶體空間。
2樓:匿名使用者
首先考慮你最後乙個問題:用malloc函式得到的指標之後能用來幹什麼了?我們平常程式與現實環境的互動中,很多輸入的資料是不能**的,不管是資料內容還是資料量都可能超出我們本身的預期,我們這個malloc函式就是為了應對不確定的資料量而生的。
比如乙個檢測字元輸入的程式(如的輸入框),平常我們要往輸入框裡頭輸粗塵的東西不是很多,你設定個128的陣列或許都已經滿足需要了,但是如果把環境換一下,某一天有人往裡頭輸入了1k的資料,或者1m的資料怎麼?不管我們的陣列設定成多大,仿洞都有可能會有滿的時候。而這個時候如果我用連結串列組織多個即時申請的記憶體塊(函式malloc的功能),那麼無論你裝多少東西都能滿足。
不單隻在輸入方面,比如你 傳輸檔案,你傳過來巖大禪的檔案的大小是隨機的,而程式如果固定用乙個陣列來裝你的檔案就可能溢位,而如果我有malloc,那麼只要在執行時根據你傳過來的檔案size即時申請乙個記憶體塊就ok了。前面那個問題:有什麼法能去給p所指向的那塊位址賦值?
已知:p=(int*)malloc(100*sizeof(int));你只要用*(p+i)就可以訪問塊裡的第i個整型資料了!例如:
p=(int*)malloc(100*sizeof(int));p+0)=1;*(p+1)=2;*(p+4)=*p+1)+*p+0);
malloc函式會引起段錯誤嗎
3樓:
malloc產生段錯誤可能是如下原因:
1、指標非法,比如使用沒有初始化的指標(沒有為此指標指向的物件分配空間),或著free掉之後再次使用。
2、陣列訪問越界,訪問的元素下標超過陣列圍長3、快取溢位,對於這種while的程式,這個問題最容易發生,多此sprintf或著strcat有可能將某個buff填滿,溢位,所以每次使用前,最好memset一下,不過要是一開始就是段錯誤,而不是執行了一會兒出現的,這種情況的可能性就比較小。
malloc 向系統申請分配指定size個位元組的記憶體空間。返回型別是 void* 型別。void* 表示未確定型別的指標。
c,c++規定,void* 型別可以強制轉換為任何其它型別的指標。
c語言題目(函式呼叫),C語言題目(函式呼叫)
a宣告時形參名可以忽略也可以任意合法的變數名,但是其型別不能忽略。以上的講,可能你不好理解,我來告訴你吧 a型別必須要一樣,而且數量一定要相同,宣告形參可以寫也可以不寫 bc語言中,在宣告函式的時候其形式引數可以只是資料型別不用寫出具體的識別符號,如果要寫出具體的識別符號的話,就一定要和函式定義的識...
php中如何呼叫函式,PHP中如何呼叫函式?
如果agree有顯示結果 可以這樣做 if get a 1 其實你應分前後臺,分兩個檔案,一個顯示給客戶,在ie上執行,叫前臺 一個處理事務在伺服器上執行,叫後臺 用js從顯示頁跳轉到處理頁 或用提交表單,可處理更多資訊 處理完再跳轉到顯示頁 樓主都沒分清客戶端和服務端。可以試著用ajax看看 如果...
C語言中函式呼叫問題,C語言中函式的呼叫
首先我們來說一下,你這個程式是有很大的問題的。函式有且只有唯一一個返回值,當程式執行到return的時候,這個函式就結束並返回了。所以,你這裡寫2個return來返回最大值和最小值是不可能的。再者,如果你想使用返回值作為最大值,最小值的傳遞,那麼在main函式中,你呼叫star函式的時候需要一個變數...