带双指针的二维数组

问题描述 投票:0回答:1

我想用双指针实现二维数组,并且我希望每个数组在内存空间中是连续的。所以每个数组之间应该有 20 个字节。但下面的代码给出了我认为的不同结果。 谁能解释一下为什么每个数组不连续?

#define ROW 5
#define COL 5

int main() {
  int **ptr = (int **)malloc(sizeof(int *)*ROW);
  for(int i=0; i<ROW; i++) {
    *(ptr+i) = (int *)malloc(sizeof(int)*COL);
  }

  printf("%p\n", *(ptr+0));
  printf("%p\n", *(ptr+1));
  printf("%p\n", *(ptr+2));
  printf("%p\n", *(ptr+3));

return 0;
}

输出:

0000 0df3 4325 1450
0000 0df3 4325 1470
0000 0df3 4325 1490
0000 0df3 4325 14b0

预计:

0000 0df3 4325 1450
0000 0df3 4325 1464
0000 0df3 4325 1478
0000 0df3 4325 148c
arrays c pointers
1个回答
0
投票

您所做的不是分配二维数组(即数组的数组)。相反,您所做的是分配一个一维指针数组,每个指针都指向一个

int
元素数组。这些数组可以位于内存中的任何位置,因为
malloc
返回的内存块不一定彼此相邻。

如果要分配实际的 2D 数组,则应该使用对

malloc
的单个调用,以便保证所有内存都是连续的。这是一个例子:

#include <stdio.h>
#include <stdlib.h>

#define NUM_ROWS 5
#define NUM_COLS 5

int main()
{
    int (*ptr)[NUM_COLS] = malloc( sizeof *ptr * NUM_ROWS );
    if ( ptr == NULL )
    {
        fprintf( stderr, "memory allocation failure!\n" );
        exit( EXIT_FAILURE );
    }

    printf( "%p\n", (void*) ptr[0] );
    printf( "%p\n", (void*) ptr[1] );
    printf( "%p\n", (void*) ptr[2] );
    printf( "%p\n", (void*) ptr[3] );
}

该程序有以下输出:

0x179c2a0
0x179c2b4
0x179c2c8
0x179c2dc

如您所见,子阵列现在彼此相邻。

© www.soinside.com 2019 - 2024. All rights reserved.