二次元配列の動的確保について
Posted: 2010年9月19日(日) 10:07
こんにちは。いつもお世話になります。早速ではありますが、「ポインタの極意」(柴田望洋)のP268にある以下のプログラムをご覧ください。
------------------
------
のピープ領域を確保するp=(int (*)[3])calloc(height*3,sizeof(int))の部分の引数を
p=(int (*)[3])calloc(height*3,sizeof(*p))
p=(int (*)[3])calloc(height,sizeof(int (*)[3]))
と変更したとき、上は問題ないのですが、下についてはpを解放する時点でエラーが発生します(確保する時点では問題なく動作します)。確保している領域は変わらないと思うのですが、なにがまずいのか、教えていただけると助かります。よろしくお願いいたします。
------------------
#include <stdio.h> #include <stdlib.h> int main(void){ int df; int height; int (*p)[3]; scanf("%d",&height); p=(int (*)[3])calloc(height*3,sizeof(int)); if(p==NULL) printf("失敗\n"); else{ int i,j; for(i=0;i<height;i++) for(j=0;j<3;j++) p[j]=0; for(i=0;i<height;i++) for(j=0;j<3;j++) printf("p[%d][%d]=%d\n",i,j,p[j]); free(p); } return 0; }
------
のピープ領域を確保するp=(int (*)[3])calloc(height*3,sizeof(int))の部分の引数を
p=(int (*)[3])calloc(height*3,sizeof(*p))
p=(int (*)[3])calloc(height,sizeof(int (*)[3]))
と変更したとき、上は問題ないのですが、下についてはpを解放する時点でエラーが発生します(確保する時点では問題なく動作します)。確保している領域は変わらないと思うのですが、なにがまずいのか、教えていただけると助かります。よろしくお願いいたします。