Re: [問題] 分配記憶體給2d array的問題

看板C_and_CPP作者 (非天夜翔)時間13年前 (2012/04/09 19:14), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《Snr (水餃)》之銘言: : 小弟是看一篇blog有關C語言的討論 : http://edisonx.pixnet.net/blog/post/88369759 : 有下列一些問題 : 1. : 其中有一段說 : 事實上 C language 在表達 pointer 大小時,只有一種寫法:sizeof(void *)。但有時 : 在教學的時候, : int **a = (int**)malloc(sizeof(int*) * 20); : 這種寫法反而讓大多人認為較為清楚,同時基於一些 pointer 加法問題等,有時反而不 : 會強調一定要用 void** a 、sizeof(void*) 等用法。 : 這段完全看不懂@@~ 任何的 pointer 的大小都是固定的 表達式為 sizeof (void *) 所以 int **a = (int**)malloc(sizeof(int *) * 20); 原始應寫為 void **a = (void**)malloc(sizeof(void*) * 20); 但為了清楚辨別,才以第一種寫法。 : 2. 關於動態分配記憶體給2d array : //v[h][w] : //這段程式碼沒問題 : /* allocate */ : int *trunk = (int*)malloc(sizeof(int)*h*w); : int **v = (int **)malloc(sizeof(int*)*h); : for(i=0; i<h; ++i) : v[i] = trunk, trunk+=w; : /* set value */ : memset(v[0], 0, sizeof(int)*w*h); : /* release */ : free(*v); : free(v); : 另一種作法相似,其作法是把額外的 pointer 也塞到 heap 裡去,使其 malloc 次數少 : 一次。 : 這邊感覺怪怪的 : size_t w=2, h=3; : // allocate : int *p; //為什麼不是h*sizeof(int *) : int **v = (int **)malloc(w*sizeof(int *) + w*h*sizeof(int)); : p = (int *)(v+w); //為什麼不是p = (int *)(v+h); : for(i=0; i<w; ++i) //為什麼不是i<h p+=w 我覺得這樣比較合理吧 : v[i]=p, p+=h; : /* release */ : free(v); : 還是說我弄錯作者的意思了 : 謝謝各位大大 個人認為是他筆誤了, 第一個是 v[h][w] 第二、三個變成了 v[w][h]。 你下載她的 ArrayManagement.rar 其中 new3.c 的寫法就是你所提的, 故個人認定純粹是筆誤。 -- 渴望飛翔在自由中, 期望逃離這拘束的現實, 一切都讓他隨著而去, 獨自躲在黑暗空氣中, 舔舐被狠狠撕裂的傷口。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 1.164.108.7 ※ 編輯: csihcs 來自: 1.164.108.7 (04/10 03:22)

04/10 03:53, , 1F
04/10 03:53, 1F

04/10 03:55, , 2F
雖然你家機器極可能跟你講的一樣,但沒有規定指標要一樣大
04/10 03:55, 2F

04/10 12:13, , 3F
謝謝csihcs大與Favonia大
04/10 12:13, 3F
文章代碼(AID): #1FWpK2IM (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1FWpK2IM (C_and_CPP)