如何申请动态二维数组?

如何申请动态二维数组?

文章目录

方法一 : 指针数组注意

方法二 :数组指针注意

方法一 : 指针数组

其中array是二级指针,

先给array分配内存,做为每一行的起点再给每行的起点,array[i] 分配内存, 即分配列内存

void test()

{

int row = 5, col = 5;

int** array;

// 分配一个指针数组,其中每个元素都将指向一行

array = (int**)malloc(row * sizeof(int*));

if (array == NULL) {

// 处理内存分配失败的情况

exit(1);

}

// 为每一行分配内存

for (int i = 0; i < row; ++i) {

array[i] = (int*)malloc(col * sizeof(int));

printf("%p\n", array[i]);

}

/*********对这个二维数组赋值***********/

array[1][1] = 1; //和正常一样

printf("%d", array[1][1]);

}

注意

这样分配的内存对各行的地址不连续 差值 1-2: 9570922722688 - 9570922722384 = 304 字节 差值 2-3: 9570922722384 - 9570922722816 = -432 字节 差值 3-4: 9570922722816 - 9570922722432 = 384 字节 差值 4-5: 9570922722432 - 9570922722352 = 80 字节

方法二 :数组指针

与法一相比,各行的地址是连续的

#include

#include

int main()

{

//直接申请3行4列的二维数组指针

int(*p)[4] = (int(*)[4])malloc(3 * 4 * sizeof(int));

for (int i = 0; i < 3; i++)

{

for (int j = 0; j < 4; j++)

{

printf("%p\n", &p[i][j]); //打印每一个变量的地址

}

}

free(p); //用完之后,最后把p释放掉

return 0;

}

注意

与法一相比各行的地址是连续的申请内存时如 其中的强转类型 里不能填变量 int(*)[x] 这样的写法错的 int(*p)[4] = (int(*)[4])malloc(3 * 4 * sizeof(int));

也就是说方法二不能满足希望申请不同大小内存的情况,因为申请内存时的强转部分里必须要是常量

✧ 相关推荐 ✧

【原】世界杯历史上最恶劣的犯规,却没有受到任何处罚
小平奈緒
365bet博彩官网

小平奈緒

📅 10-23 👁️ 7313
【MySQL高级】MySQL表的七种连接方式【提供演示SQL】
365bet足球官方开户网

【MySQL高级】MySQL表的七种连接方式【提供演示SQL】

📅 10-14 👁️ 6663