文章目录
方法一 : 指针数组
其中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<stdio.h>
#include<malloc.h>
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));
- 也就是说方法二不能满足希望申请不同大小内存的情况,因为申请内存时的强转部分里必须要是常量