連続にならない例:
main1.c
#include <stdio.h>
int main(int argc, const char * argv[]) {
int rows=2;
int columns=2;
int **matrix = (int**)malloc(rows*sizeof(int*));
for(int i=0; i<rows; i++){
matrix[i]=(int*)malloc(columns*sizeof(int));
}
for(int i=0; i<rows; i++){
for(int j=0; j<columns; j++){
printf("matrix[%d][%d]=%p\n", i, j, &matrix[i][j]);
}
}
}
実行結果:
main1.o
matrix[0][0]=0x7fd35a4026e0
matrix[0][1]=0x7fd35a4026e4
matrix[1][0]=0x7fd35a4026f0
matrix[1][1]=0x7fd35a4026f4
matrix[0][1]とmatrix[1][0]の間でアドレスが不連続になっている。mallocを2回に分けて行っているのが原因である。
全てのメモリを先にmallocで割り当ててから、アドレスを分割して代入すればこれは避けられる。
main2.c
#include <stdio.h>
int main(int argc, const char * argv[]) {
int rows=2;
int columns=2;
int **matrix = (int**)malloc(rows*sizeof(int*));
matrix[0]=(int*)malloc(rows*columns*sizeof(int));
for(int i=0; i<rows; i++){
matrix[i]=matrix[0] + i*columns;
}
for(int i=0; i<rows; i++){
for(int j=0; j<columns; j++){
printf("matrix[%d][%d]=%p\n", i, j, &matrix[i][j]);
}
}
}
実行結果:
main2.o
matrix[0][0]=0x7f930c4026e0
matrix[0][1]=0x7f930c4026e4
matrix[1][0]=0x7f930c4026e8
matrix[1][1]=0x7f930c4026ec
matrix[0][1]とmatrix[1][0]の間でアドレスが連続になった。
参考:
どやっ!