Re: [問題] 分配記憶體給2d array的問題
※ 引述《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
04/10 12:13, 3F
討論串 (同標題文章)