C語言上有遇到動態記憶體配置問題
說明直接放在下方!
Q1:為何在下述程式內, 配置二維陣列的記憶體後, 執行出來的陣列位址每換一列都不是加4 byte.例如:3x3:&arr[0][2]=00BD3200 --> &arr[1][0]=00BD3210 差10 Bytesarr[0]=00BD31F8, arr[1]=00BD3210差18.但若不做記憶體 配置 , 則3x3,nxn每個都是4 bytes.Q2:為何做記憶體配置和沒有做配置, arr+n的address和arr[n]有差異?ex:
做記憶體配置>> 取arr+n的值不會等於arr[n]的值. 且arr+0,arr+1差4 byte. arr[0],arr[1]差18.arr+0=00BD31E0; arr[0]=00BD31F8;arr+1=00BD31E4; arr[1]=00BD3210;
不做記憶體配置>> 取arr+n的值會等於arr[n]的值. 且arr+0,arr+1差12 byte. 剛好是3x4 byte.arr+0=0060FE8C; arr[0]=0060FE8C; &arr[0]=0060FE8C;
arr+1=0060FE98; arr[1]=0060FE98; &arr[1]=0060FE98;
arr+2=0060FEA4; arr[2]=0060FEA4; &arr[2]=0060FEA4;int main()
{
int i,j,n;
int count=0;
printf("Input the size:");
scanf("%d", &n);
int **arr=(int **)malloc(n*sizeof(int *));
for(i=0;i<n;i++)
arr[i]=(int *)malloc(n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
arr[i][j]=count;
count++;
}
printf("arr+0=%p; arr[0]=%p; *arr[0]=%d; *(arr+0)=%p; &arr[0][2]=%p\n",arr+0, arr[0], *arr[0], *(arr+0), &arr[0][2]);
printf("arr+1=%p; arr[1]=%p; *arr[1]=%d; *(arr+1)=%p; &arr[1][0]=%p\n",arr+1, arr[1], *arr[1], *(arr+1), &arr[1][0]);
printf("arr+2=%p; arr[2]=%p; *arr[2]=%d; *(arr+2)=%p; &arr[2][0]=%p\n",arr+2, arr[2], *arr[2], *(arr+2), &arr[2][0]);
for(i=0;i<n;i++)
free(arr[i]);
free(arr);
return 0;
}結果:arr+0=00BD31E0; arr[0]=00BD31F8; *arr[0]=0; *(arr+0)=00BD31F8; &arr[0][2]=00BD3200
arr+1=00BD31E4; arr[1]=00BD3210; *arr[1]=3; *(arr+1)=00BD3210; &arr[1][0]=00BD3210
arr+2=00BD31E8; arr[2]=00BD3228; *arr[2]=6; *(arr+2)=00BD3228; &arr[2][0]=00BD3228
===========================
From 艾鍗C程式設計講義 |
動態配置2維空間
printf("Input the size:");
scanf("%d", &n);
printf("%d\n",sizeof(arr)); // 4 byte
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
arr[i][j]=count;
count++;
}
show(n,*arr);
free(arr);
參考: