动态分配一个二维字符串数组

(1) 分配可能不连续的内存
申请
char**pps8Output = (char **) malloc(n * sizeof(char *));
对于pps8Output而言,它获得了一块动态分配的连续内存,这块连续的内存可以放n个char *指针。
 下面为每一行malloc一次内存,这样分配的内存就不一定是连续的。
for (int i = 0; i < n; i++) 
{pps8Output[i] = (char *) malloc(lens * sizeof(char));
}
释放
本着先malloc的内存,后free的原则进行释放。
    for (int i = 0; i < n; i++) {free(pps8Output[i]);}free(pps8Output);
该方法:
 n行的字符串数组,每个都是malloc动态分配的,所以整个二维字符串数组的内存可能不连续。
完整demo:
#include<stdio.h>
#include<stdlib.h>int main() {int n = 3;int lens = 10;char**pps8Output = (char **) malloc(n * sizeof(char *));///< mallocfor (int i = 0; i < n; i++) {pps8Output[i] = (char *) malloc(lens * sizeof(char));printf("pps8Output[%d] ptr:%p \r\n", i, pps8Output[i]);}///< freefor (int i = 0; i < n; i++) {free(pps8Output[i]);}free(pps8Output);return 0;
}//deubg:
//pps8Output[0] ptr:0x5625f38782c0 
//pps8Output[1] ptr:0x5625f38792f0 
//pps8Output[2] ptr:0x5625f3879310 
(2) 分配连续的内存
申请
char **pps8Output = (char **) malloc(n * sizeof(char *));
 对于pps8Output而言,它获得了一块动态分配的连续内存,这块连续的内存可以放n个char *指针。
 下面一次性malloc好全部的内存,然后计算每行的起始地址,我们通过下标访问 pps8Output与赋值。
pps8Output[0] = (char *) malloc(n * lens * sizeof(char));for (int i = 1; i < n; i++)
{pps8Output[i] = pps8Output[0] + i * lens;
}
释放
由于是一次malloc出来的,所以只需要一次free即可。
 free(pps8Output);
该方法:一次性malloc全部所需的内存,该分配方式属于连续的内存。
完整demo:
#include<stdio.h>
#include<stdlib.h>int main() {int n = 3;int lens = 10;char**pps8Output = (char **) malloc(n * sizeof(char *));///< mallocpps8Output[0] = (char *) malloc(n * lens * sizeof(char));for (int i = 1; i < n; i++){pps8Output[i] = pps8Output[0] + i * lens;printf("pps8Output[%d] ptr:%p\r\n", i, pps8Output[i]);}///< freefree(pps8Output);return 0;
}//deubg:
//pps8Output[1] ptr:0x5591309b52ca
//pps8Output[2] ptr:0x5591309b52d4
(3) 将二维字符串数组看成一维字符串数组
申请
char *ps8Output = (char *) malloc(n * lens * sizeof(char));
 将二维字符串数组看做一维字符串数组,开始时一次性malloc全部所需要的内存,通过手工计算索引的方式来分配内存地址。
for (int i = 0; i < n; i++) 
{for (int j = 0; j < lens; j++) {*(ps8Output + (i*lens) + j) = 'a'; ///< 以'a'为例进行赋值演示}
}
释放
由于是一次malloc出来的,所以只需要一次free即可。
 free(ps8Output );
该方法:
 将二维字符串数组看做一维字符串数组。pps8Output 是一个字符串指针,ps8Output+1就是ps8Output的地址+1,每一行都有lens个元素,那么使用 lens*i表示跨过的元素个数。
完整demo:
#include<stdio.h>
#include<stdlib.h>int main() {int n = 3;int lens = 10;char *ps8Output = (char *) malloc(n * lens * sizeof(char));///< mallocfor (int i = 0; i < n; i++) {   for (int j = 0; j < lens; j++) {*(ps8Output + (i*lens) + j) = 'a';printf("%p \r\n", (ps8Output + (i*lens) + j));}}///< freefree(ps8Output);return 0;
}//debug:
//0x5560bb0fb2a0 
//0x5560bb0fb2a1 
//0x5560bb0fb2a2 
//0x5560bb0fb2a3 
//0x5560bb0fb2a4 
//0x5560bb0fb2a5 
//0x5560bb0fb2a6 
//0x5560bb0fb2a7 
//0x5560bb0fb2a8 
//0x5560bb0fb2a9 
//0x5560bb0fb2aa 
//0x5560bb0fb2ab 
//0x5560bb0fb2ac 
//0x5560bb0fb2ad 
//0x5560bb0fb2ae 
//0x5560bb0fb2af 
//0x5560bb0fb2b0 
//0x5560bb0fb2b1 
//0x5560bb0fb2b2 
//0x5560bb0fb2b3 
//0x5560bb0fb2b4 
//0x5560bb0fb2b5 
//0x5560bb0fb2b6 
//0x5560bb0fb2b7 
//0x5560bb0fb2b8 
//0x5560bb0fb2b9 
//0x5560bb0fb2ba 
//0x5560bb0fb2bb 
//0x5560bb0fb2bc 
//0x5560bb0fb2bd 引经据典
http://www.ituring.com.cn/book/1147















