用二级指针给一级指针分配空间

84 阅读2分钟
#include <stdio.h>
#include <stdlib.h>

// 函数执行完后会释放形参的内存空间,执行前形参会拷贝一份实参的值
// 多级指针在函数中存储值的学习
typedef struct st{
    int a;
}ST, *ST1;

// 错误
// 形参申请的空间直接赋值给了一级指针,函数结束后,该空间被释放了,回到主函数后,实参仍然是原来在main函数中分配的空间,所以在该函数的一切操作是无用的
void test1(ST1 st)
{
    ST1 sst = (ST1) malloc(sizeof(ST));
    sst->a = 1111;
    st = sst; // 将申请的空间分配给一级指针,函数结束后,形参被释放了,也就是申请的空间被释放了
}

// 正确
// 形参为二级指针申请的空间也是二级指针的,实参的地址被二级指针存储起来了,利用二级指针里的一级指针(也就是main函数中的指针变量)存储函数分配的空间,
void test2(ST1 *st)
{
    ST1 sst = (ST1) malloc(sizeof(ST));
    sst->a = 2222;
    *st = sst; // 将申请的空间分配给二级指针中的一级指针(也就是在main中声明的一级指针),函数结束后,释放的是二级指针,而一级指针存储了该地址
}

// 错误
// 形参申请的空间给了二级指针,函数结束后,该空间就被释放了,存储的数据也就消失了
void test3(ST1 *st)
{
    ST1 sst = (ST1) malloc(sizeof(ST));
    sst->a = 3333;
    st = &sst; // 直接将申请的空间分配给二级指针,函数结束后,形参被释放了,该空间也被释放了
}

int main(){
 printf("-------------\n");
 ST1 ss = (ST1)malloc(sizeof(ST));
 test1(ss);
 printf("ss.a: %d \n",ss->a); // 错误值

 printf("-------------\n");
 ST1 sss = (ST1)malloc(sizeof(ST)); // 可以不分配空间
 test2(&sss);
 printf("sss.a: %d \n",sss->a); // 2222

 printf("-------------\n");
 ST1 ssss = (ST1)malloc(sizeof(ST)); // 可以不分配空间
 test3(&ssss);
 printf("ssss.a: %d \n",ssss->a); // 错误值
 
 return 1;
}