伊莉討論區

標題: 要如何驗證malloc(size)不會立即配置size大小的記憶體 [打印本頁]

作者: frank1234206    時間: 2011-12-24 01:25 AM     標題: 要如何驗證malloc(size)不會立即配置size大小的記憶體

不好意思  因為想了兩三天實在是不懂 所以才PO上網問問各位大大
(GNU C)

要如何驗證malloc(size)不會立即配置malloc(size)  size大小的記憶體

#include<stdio.h>
#inlcude<stdlib.h>

int main()
{
     int *p;

 p = (int*)malloc(sizeof(int));         //狀況一 作業系統尚未配置記憶體空間 僅virtual memory address

 *p = 100;               //狀況二 已配置記憶體空間

     return 0;
}

要如何分辨出這兩種情況的差異??(用C code)
作者: aaystx    時間: 2011-12-24 02:10 PM

Q: 要如何驗證malloc(size)"不會"立即配置size大小的記憶體
在下不知原PO確切的問題, 以下僅就我所知回答.
1. 根據apue p.189, 「ISO C specifies three functions for memory allocation  1. malloc, which allocates a specified number of bytes of memory. The initial value of the memory is indeterminate」, 以及「All three return: non-null pointer if OK, NULL on error」
2. 如果是檢查是否成功分配成功, 在C語言中可以使用assert(p!=NULL); 一旦失敗, 程式直接terminate, 並且說明是第幾行出錯, 可以include <assert.h>. 而在C++可以使用throw 和 catch來處理
作者: Force[TW]    時間: 2011-12-24 07:10 PM

本帖最後由 Force[TW] 於 2011-12-24 07:22 PM 編輯
Q: 要如何驗證malloc(size)"不會"立即配置size大小的記憶體
在下不知原PO確切的問題, 以下僅就我所知回答. ...
aaystx 發表於 2011-12-24 02:10 PM


我想,他所指的可能是 malloc 配置在虛擬記憶體或是實體記憶體內的問題。

程式如何去配置記憶體,是由作業系統(OS,Operating System)去決定的,現今的作業系統大多會去跑虛擬記憶體;舊的作業系統(例如 MS-DOS)一般都是跑實體(MS-DOS 當初設計時沒有加入虛擬記憶體功能的概念)。

對於現今而言,程式想要哪些資源都是由作業系統來決定與支配,完全依賴作業系統。
作者: aaystx    時間: 2011-12-24 10:05 PM

回復 3# Force[TW]

感謝Force[TW]的解答
那我也想知道原PO問題的答案, 還有這能夠在code裡面用如原PO那樣*p = 100這樣的statement看出來嗎?好像只能看出能不能改變indeterminate的memory而已, 如果p是NULL pointer的話, assign不會成功
作者: yp7346    時間: 2011-12-25 10:36 AM

承 aaystx 所言...
在呼叫 malloc 後 判斷 回傳值是否為 NULL
if (p==NULL)
{
   /// malloc failed.
}

又假若 malloc 失敗
在執行 *p = 100; 時
應該就會的到 segmentation fault
作者: ohha0221    時間: 2011-12-26 02:21 AM

提示: 作者被禁止或刪除 內容自動屏蔽




歡迎光臨 伊莉討論區 (http://a401.file-static.com/) Powered by Discuz!