LoginSignup
7
10

More than 5 years have passed since last update.

c言語_2次元配列を連続したメモリに割り当てる

Posted at

連続にならない例:

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]の間でアドレスが連続になった。
 
参考:

詳説Cポインタ

 
 
 
どやっ!

7
10
5

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
10