全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:677
推到 Plurk!
推到 Facebook!

[請問]有關記憶体配置的問題??

尚未結案
yungfan
一般會員


發表:25
回覆:13
積分:7
註冊:2003-12-29

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-03-16 22:16:16 IP:163.28.xxx.xxx 未訂閱
typedef short PCM[2][18][32]; PCM *pcm_sample; pcm_sample = (PCM *) malloc( (long)sizeof(PCM) ); 請問一下 (long) 在這裡的作用是什麼呢?? 謝謝啦…^^
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-03-17 00:26:49 IP:61.230.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-03-17 02:29:25 IP:218.165.xxx.xxx 未訂閱
Royce兄您好: 先謝謝你熱心指導喔…^^ 在你文中有提到: 1. 將原本使用的記憶空間大小做改變(通常內容不變) 或者 2. 讓編譯期瞭解 你對資料做了新的解釋. 但若是要改變記憶体大小,應該是sizeof( (long)PCM )才可以作到吧… 如果是(long)sizeof(PCM),它的size是一樣的啊… 所以用途應該是你說的第二個,但我不懂把原本預設的size_t改成long會有什麼 影響,想請問一下以你的經驗來看會是什麼原因呢?? 真是感謝你啦…:p
anpino
版主


發表:31
回覆:477
積分:231
註冊:2003-01-02

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-03-17 09:44:32 IP:61.66.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-03-17 19:59:49 IP:140.126.xxx.xxx 未訂閱
yungfan 妳好,   是的, 在PC 上 long 與 size_t 所佔用的是相同記憶體   大小... 所以 這樣做呢 ... 沒有任何意義 也沒有必要   因此, 妳說對了 就是讓編譯器瞭解你對資料有新的解釋,   另外, 假設他轉成 long 好了, 編譯器在叫用 malloc 時   會發現其實 他需要的是一個 size_t... 根據內部語意的   解釋會再將 long 轉成 size_t ... 因此所以, 我才會說   這樣做是沒有必要的...    *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
系統時間:2024-05-18 17:10:29
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!