【C语言】动态分配二维字符串数组

【C语言】动态分配二维字符串数组动态分配一个二维字符串数组 1 分配可能不连续的内存申请 charpps8Outp char malloc n sizeof char 对于 pps8Output 而言 它获得了一块动态分配的连续内存 这块连续的内存可以放 n 个 char 指针 下面为每一行 malloc 一次内存 这样分配的内存就不一定是连续的 for inti 0 i

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

在这里插入图片描述

(1) 分配可能不连续的内存

申请

charpps8Output = (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); 

完整demo:

#include 
     #include 
     int main() { 
    int n = 3; int lens = 10; char**pps8Output = (char **) malloc(n * sizeof(char *)); ///< malloc for (int i = 0; i < n; i++) { 
    pps8Output[i] = (char *) malloc(lens * sizeof(char)); printf("pps8Output[%d] ptr:%p \r\n", i, pps8Output[i]); } ///< free for (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:0x5625f  

(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 
     #include 
     int main() { 
    int n = 3; int lens = 10; char**pps8Output = (char **) malloc(n * sizeof(char *)); ///< malloc pps8Output[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]); } ///< free free(pps8Output); return 0; } //deubg: //pps8Output[1] ptr:0xb52ca //pps8Output[2] ptr:0xb52d4 

(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 ); 

完整demo:

#include 
     #include 
     int main() { 
    int n = 3; int lens = 10; 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'; printf("%p \r\n", (ps8Output + (i*lens) + j)); } } ///< free free(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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208743.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:52
下一篇 2026年3月19日 上午10:52


相关推荐

  • 抽象类和接口(我学习做的笔记供大家参考)

    抽象类和接口(我学习做的笔记供大家参考)

    2021年5月24日
    99
  • js中的闭包[通俗易懂]

    js中的闭包[通俗易懂]闭包是js的一个难点也是它的一个特色,是我们必须掌握的js高级特性,那么什么是闭包呢?它又有什么用呢?我们都知道,js的作用域分两种,全局和局部,基于我们所熟悉的作用域链相关知识,我们知道在js作用域环境中访问变量的权利是由内向外的,内部作用域可以获得当前作用域下的变量并且可以获得当前包含当前作用域的外层作用域下的变量,反之则不能,也就是说在外层作用域下无法获取内层作用域下的变量,同样在不同的函…

    2022年6月25日
    29
  • 使用强类型的Include显式预加载

    使用强类型的Include显式预加载

    2021年8月17日
    51
  • 经典vbs代码收集「建议收藏」

    经典vbs代码收集「建议收藏」经典vbs代码收集2011年01月17日  经典的vbs代码,收集起来也为了以后学习。  VBS脚本用途很多:  1.计算  2.处理文件和文件夹  3.管理Windows  4.处理Word,Excel,PowerPoint等Office文档  5.嵌入网页,驱动dHTML  6.编写HTTP通信  7.调用系统功能…

    2022年5月18日
    63
  • 2021国产LINUX深度操作系统20.2.4安装安免免评测软件[通俗易懂]

    2021国产LINUX深度操作系统20.2.4安装安免免评测软件[通俗易懂]2021年9月,国产深度操作系统增加了安免免评测软件,下面安装试用:一,在应用商店里面搜索安装。二,安装完成后桌面生成图标。三,主界面四,测试中五,结果得分…

    2022年5月17日
    77
  • C++/C与Java的区别

    C++/C与Java的区别Java是由C++发展而来的,保留了C++的大部分内容,其编程方式类似于C++。但Java的句法更清晰、规模更小、更易学。Sun公司曾对多种程序设计语言进行分析研究,取其精华去其糟粕,最终推出了Java。Java从根本上解决了C++的固有缺陷,形成了新一代面向对象的程序设计语言(当然了解决问题也是需要代价的)。一、跨平台(C\C++和Java)Java是基于JVM虚拟机的跨…

    2022年7月7日
    26

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号