1樓:格里程式設計辦公技巧
這說明你比較幸運,沒有出現程式崩潰。
首先在堆疊申請的記憶體,後面也許還是沒有別友腔敬的程式在用,所以你的程式超過你申請圓明的記憶體也不會出現問題;
但是如果有別的程式好慎已經佔用了你申請記憶體的後面空間,你再用就會出現無法寫入,程式崩潰。
2樓:電燈劍客
所謂的分配了4位元組記憶體, 就是給你一桐舉桐個位址, 然後標記了後面4個位元組是給你用的, 但你可以按這個位址繼續向後(非法)訪問, 除了p[0]之外, 對p[1], p[2], 的讀寫局坦訪問都是非法的。
c語言編譯器不進行越界檢查, 所以表面上你的程式還能跑, 但這樣非法訪問記憶體答毀的程式很危險。
3樓:網友
能」只是系統不報異常而已,記憶體是平板式放置的,可寫區域有很大,只要不超過heap size就不會報啟敬錯,但是你肯定要破壞其他資料,掘旁旅真正報錯的時候你早就不知道怎麼辦了。
想「分配了4位元組超過就報錯」等於讓系統幫你檢查內判凳存訪問越界,這個代價是非常高昂的,效能上根本不允許。
malloc()到底如何申請記憶體空間
4樓:植星郗帥紅
malloc()到底從**得到了記憶體空間?
答案是從堆裡面獲得空間。也就是說函式返回的指標是指向堆裡面的一塊記憶體。
作業系統中有乙個記錄空閒。
記憶體位址。的。
連結串列。當作業系統收到程式的申請時,就會遍歷該連結串列,然後就尋找第乙個空間大於所申請空間的堆結點,然後就將該結點從空閒結點連結串列中刪除,並將該結點的空間分配給程式。
malloc函式。
的實質體現在,它有乙個將可用的記憶體塊連線為乙個長長的列表的所謂空閒連結串列(free
list)。呼叫malloc函式時,它沿連線表尋找乙個大到足以滿足使用者請求所需要的記憶體塊(根據不同的演算法而定(將最先找到的不小於申請的大小記憶體塊分配給請求者,將最合適申請大小的空閒記憶體分配給請求者,或者是分配最大的空閒塊記憶體塊)。然後,將該記憶體塊一分為二(一塊的大小與使用者請求的大小相等,另一塊的大小就是剩下的位元組)。
接下來,將分配給使用者的那塊記憶體傳給使用者,並將剩下的那塊(如果有的話)返回到連線表上。
呼叫free函式時,它將使用者釋放的記憶體塊連線到空閒鏈上。到最後,空閒鏈會被切成很多的小記憶體片段,如果這時使用者申請乙個大的記憶體片段,那麼空閒鏈上可能沒有可以滿足使用者要求的片段了。於是,malloc函式請求延時,並開始在空閒鏈上翻箱倒櫃地檢查各記憶體片段,對它們進行整理,將相鄰的小空閒塊合併成較大的記憶體塊。
如果無法獲得符合要求的記憶體塊,malloc函式會返回null指標,因此在呼叫malloc動態申請記憶體塊時,一定要進行。
返回值。的判斷。
在此也要說明就是因為new和malloc需要符合大眾的申請記憶體空間的要求,針對。
泛型。提供的,分配記憶體設計到分配演算法和查詢,此外還要避免。
記憶體碎片。所以其效率比較低下,因此有時。
程式猿。會自己重寫new和delete,或者建立乙個。
記憶體池。來管理記憶體,提高程式執行的效率。
malloc函式分配的記憶體空間有名字嗎
5樓:網友
本質上所有記憶體空間都不存在名字的,記憶體空間只有位址。而所謂變數名稱(任何名稱)只存在於源**中,程式一旦編譯成機器語言,也就是二進位碼,變數名稱將被記憶體位址所取代。
而從源**角度看,準確的說malloc不存在名字,普通變數和指標變數有名字。
當定義乙個變數時,先分配一塊該型別所規定長度的記憶體空間(比如int型別是4位元組),然後將該空間首位址與變數名繫結起來(變數表),當程式中其他地方使用該變數名的時候,編譯器根據變數表取得該變數位址,進而進行相關訪問,這叫直接訪問,在機器語言層面叫直接定址。
malloc是乙個通用的記憶體分配函式,因為是通用函式,所以也不在乎分配的記憶體空間存放什麼型別的資料,引數只要給定記憶體長度即可,所以返回的是乙個虛指標(實際上只是個無型別的位址值,說它虛指標只是乙個習慣)。但是要操作這塊記憶體空間需要通過確切的指標變數訪問,因此必須將返回的虛指標強制轉換成指定的型別,並賦值給乙個指標變數,假設定義了指標p。和上面一樣,定義p的時候也需要分配一塊記憶體空間,將該空間與變數名p在變數表中繫結起來,然後將malloc返回的位址存入p的位址空間中。
在訪問時,編譯器根據變數表取得p的位址,從p的位址中取得之前存放的malloc返回的位址,再根據該位址對資料訪問,這叫間接訪問(間接定址)。
最後要說明一點的是,指標和位址的區別,指標是乙個存放位址的變數,本身具有記憶體空間,也就是說指標本身也有位址,而位址就是個值。
C語言問題 用malloc申請記憶體
1.你寫的是c程式吧?c程式裡沒有引用的,不知道你編譯的問題有沒有出在這裡void build l l 你說編譯有問題,就把編譯的錯誤也帖上來。2.你的主要問題應該出在這裡 l2.d int malloc 2 sizeof l.d sizeof l.d 這個是不會得到你d指向記憶體的大小的.為什麼不...
C語言中的空指標,C語言中的空指標是什麼意思?
int p 47 這個用法是不正確的 這個語句等於下邊的 int p p 47 你直接將指標p的值賦值為47是很危險的 應為如果記憶體中地址為47的地方剛好是某個系統程式或關鍵模組佔據的話你進行下面 p 20 的賦值行為 有可能導致系統直接崩潰哦 是的,不過這很危險。而且cpu的32位保護機制也未必...
C語言,記憶體管理問題,C語言問題 記憶體的分配方式有哪幾種?
一樣大。name是char指標型別,它只記錄地址,不記錄地址裡面存的東西所以不管存多少東西,地址的長度是不會變的。這個sizeof struct mm的長度目測是8 在32位程式裡 變數定義之後,就會給變數分配空間了,不管你有沒有給它賦值。32位系統下,sizeof struct mm 為8位元組,...