多级指针的动态内存分配问题
先看例子:
为一个二级整形指针分配一份可存储 3*3 矩阵的内存。
#include<stdio.h>
#include<malloc.h>
int main()
{
int **p;
p=(int**)malloc(sizeof(int)*3*3);
//其他代码
}
在使用 p[i][j] 调用内存时,编译器会显示“取消对NULL指针p[i]的调用”
显然,这个方式有问题。
在这个例子中,对象为 int类型,内存为 int 类型的数量分配,强制转化类型为 int**
看似很对,但实际上,int** 类型为二级指针,其数据的本质是一个存放指针的地址量,
而在malloc函数中,内存是以 int 类型为目标进行分配的,这就导致了,本应该作为int的内存,被当作是int**类型。
又因为,在VS2019中,int** 与int 都为四字节,所以,p实际上得到的是连续9个的二级整形指针,
可以看作是
p == int[9](类型表达式);
在看到一般情况下的动态分配:
int *p;
p=(int*)malloc(sizeof(int)*3);
对于指针本身,如果不取地址,那么使用赋值运算,改变的始终是指针指向的对象,
而指针自己所占据的位置并没有发生任何改变。
又有,指针指向某个对象的方法就是将对象所占据的内存的地址码保存到自己所占据的空间中。
而且 malloc() 函数的返回值为所分配的内存空间的首地址。
所以,在这个动态内存分配的语句中,被分配的内存的类型与强制转换的类型相比,要低一个级别。
总之,对多级指针进行动态内存分配时,要从最高级往下一级一级分配。
例如:
int i = 0;
*p = (int**)malloc(sizeof(int*) * 3);
if (*p == NULL)
{
printf("内存不足!\n");
exit(0);
}
for (i = 0;i < 3;i++)
{
(*p)[i] = (int*)malloc(sizeof(int) * 3);
if (*p[i] == NULL)
{
printf("内存不足!\n");
exit(0);
}
}
另外,在说一下,关于 * 与 [] 的优先级问题。
[] > * ;
所以,
int ***p;
int a[3][3];
*p=a;
*p[1][1]等于*(p[1])[1]
应该用(*p)[1][1];