我想用双指针实现二维数组,并且我希望每个数组在内存空间中是连续的。所以每个数组之间应该有 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
您所做的不是分配二维数组(即数组的数组)。相反,您所做的是分配一个一维指针数组,每个指针都指向一个
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
如您所见,子阵列现在彼此相邻。