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