[請問]有關記憶体配置的問題?? |
尚未結案
|
yungfan
一般會員 發表:25 回覆:13 積分:7 註冊:2003-12-29 發送簡訊給我 |
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
yungfan 你好,
(long) 在這裡的作用是 強制轉型, 一般使用它的目的
是要1. 將原本使用的記憶空間大小做改變(通常內容不變)
或者 2. 讓編譯期瞭解 你對資料做了新的解釋. 以下是 malloc 這個函數的宣告: Header File
alloc.h, stdlib.h Category
Memory Routines Prototype
void *malloc(size_t size); 因此, 你可以看到 它有一個參數 其型別是 size_t
所以 更為嚴謹的寫法是 pcm_sample = (PCM *) malloc( (size_t) sizeof(PCM) ); 但是, 下面說明了 並不需要強制轉型
The integer type of the result of sizeof is size_t. 也就是以下 這樣寫 就可以了 pcm_sample = (PCM *) malloc( sizeof(PCM) ); *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
yungfan
一般會員 發表:25 回覆:13 積分:7 註冊:2003-12-29 發送簡訊給我 |
|
anpino
版主 發表:31 回覆:477 積分:231 註冊:2003-01-02 發送簡訊給我 |
typedef short PCM[2][18][32];
PCM *pcm_sample;
pcm_sample = (PCM *) malloc( (long)sizeof(PCM) ); sizeof的回傳值型態是size_t,注意它回傳的不是2*8*32*sizeof(short)!!
而是指向PCM[0]的指標所需的記憶體大小。 由於malloc的原型是void *malloc(size_t size);
所以不論你在輸入參數前做任何參數型態以外的轉型都是多此一舉。
因為參數進入malloc後會以size_t型態做處理。 詳細的說,我以在Standard C Library中對函數執行的定義來說明:
malloc的參數是(long)sizeof(PCM),也就是說以long的型態代入。
進入malloc之前,系統會為函式配置參數副本的記憶體,
在這裡會配置一個size_t size 來儲存參數(long)sizeof(PCM),
這時候參數size已經是size_t型態,並複製(long)sizeof(PCM)的值,
也就是說,sizeof(PCM)是以size_t型態在malloc裡運作。
這就是為什麼我說在輸入參數前做任何參數型態以外的轉型都是多此一舉的理由。 這是標準C 函式庫的定義,請務必找相關書籍好好打基礎。
-------------------------------
數學系是內功很強(邏輯/分析) 資工系是招式很多(程式技巧) 就像令狐沖
|
Royce520
高階會員 發表:18 回覆:157 積分:100 註冊:2002-09-13 發送簡訊給我 |
yungfan 妳好,
是的, 在PC 上 long 與 size_t 所佔用的是相同記憶體
大小... 所以 這樣做呢 ... 沒有任何意義 也沒有必要
因此, 妳說對了 就是讓編譯器瞭解你對資料有新的解釋,
另外, 假設他轉成 long 好了, 編譯器在叫用 malloc 時
會發現其實 他需要的是一個 size_t... 根據內部語意的
解釋會再將 long 轉成 size_t ... 因此所以, 我才會說
這樣做是沒有必要的... *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩ |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |