文章目录
一、二级指针
1、为 二维指针 分配内存
2、为每个 一维指针 分配内存
3、释放 二维指针 内存
二、完整代码示例
一、二级指针
声明二级指针 :
// 声明二维指针 char **p = NULL;
1、为 二维指针 分配内存
在堆内存中 , 为 二维指针 分配一块内存空间 , 用于存储 num 个 一维指针 , 每个 一维指针 指向一块内存空间 ;
// 在堆内存中 , 分配一块内存空间 // 用于存储 num 个 一维指针 // 每个 一维指针 指向一块内存空间 p = (char **)malloc( sizeof(char*) * num );
2、为每个 一维指针 分配内存
通过遍历 , 使用 malloc 函数 在堆内存中 分配 20 字节内存 , 得到一个 一维指针变量 ;
将该 一维指针变量 分别 赋值 二维指针 指向的多个 一维指针变量 ;
通过遍历 , 向 每个 一维指针 变量 指向的内存空间中 ,
// 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 在堆内存中 分配 20 字节内存 for(i = 0; i < num; i++) { // 为每个字符分配 20 字节空间 p[i] = (char *)malloc(sizeof (char) * 20); // 向内存中写入 字符串 , 字符串内容是 i + 1 // 注意是通过通配符拼装的字符串 sprintf(p[i], "%d", i + 1); }
3、释放 二维指针 内存
先释放 二维指针 指向的 一维指针 的内存 , 这些 一维指针 指向其分配的 20 2020 字节内存空间 , 存放了一个字符串信息 ;
// 释放内存 // 先释放 num 个 一级指针 for(i = 0; i < num; i++) { if(p[i] != NULL) { free(p[i]); p[i] = NULL; } }
然后再释放 , 二级指针 指向的 内存 , 这些内存中存储这 一级指针 数据 ;
// 再释放 二级指针 if(p != NULL) { free(p); }
二、完整代码示例
完整代码示例 :
#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { // 二维指针 指向的 一维指针 个数 int num = 4; // 声明二维指针 char **p = NULL; // 循环控制变量 int i = 0; // 在堆内存中 , 分配一块内存空间 // 用于存储 num 个 一维指针 // 每个 一维指针 指向一块内存空间 p = (char **)malloc( sizeof(char*) * num ); // 遍历 二维指针 指向的多个 一维指针 // 并为每个 一维指针 在堆内存中 分配 20 字节内存 for(i = 0; i < num; i++) { // 为每个字符分配 20 字节空间 p[i] = (char *)malloc(sizeof (char) * 20); // 向内存中写入 字符串 , 字符串内容是 i + 1 // 注意是通过通配符拼装的字符串 sprintf(p[i], "%d", i + 1); } // 打印字 二维指针 指向的 num 个 一维数组 指向的 字符串 for(i = 0; i < num; i++) { printf("%s\n", p[i]); } // 释放内存 // 先释放 num 个 一级指针 for(i = 0; i < num; i++) { if(p[i] != NULL) { free(p[i]); p[i] = NULL; } } // 再释放 二级指针 if(p != NULL) { free(p); } // 命令行不要退出 system("pause"); return 0; }
执行结果 :