热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

原标题:【C语言】动态分配二维字符串数组动态分配一个二维字符串数组

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


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

在这里插入图片描述


(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
#include
int main() {

int n = 3;
int lens = 10;

char**pps8Output = (char **) malloc(n * sizeof(char *));

///
for (int i = 0; i < n; i++)
{
pps8Output[i] = (char *) malloc(lens * sizeof(char));
printf("pps8Output[%d] ptr:%p \r\n", i, pps8Output[i]);
}

///
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: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:

#inclwww.yii666.comude
#include
int main() {

int n = 3;
int lens = 10;

char**pps8Output = (char **) malloc(n * sizeof(char *));

///
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(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的文章来源站点https://www.yii666.com/地址+1,每一行都有lens个元素,那么使用 lens*i表示跨过的元素个数。


完整demo:

#include
#include
int main() {

int n = 3;
int lens = 10;

char *ps8Output = (char *) malloc(n * lens * sizeof(char));

///
for (int i = 0; i < n; i++)
{
for (int j = 0; j < lens; j++)
{
*(ps8Output + (i*lens) + j) = 'a';

printf("%p \r\n", (ps8Output + (文章来源地址52953.htmli*lens) + j));
}
}

///
free(ps8Output);文章来源地址52953.html

return 0;
}
//debug:
//0x5560bb0fb2a0
/www.yii666.com/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

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


推荐阅读
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • C++中的三角函数计算及其应用
    本文介绍了C++中的三角函数的计算方法和应用,包括计算余弦、正弦、正切值以及反三角函数求对应的弧度制角度的示例代码。代码中使用了C++的数学库和命名空间,通过赋值和输出语句实现了三角函数的计算和结果显示。通过学习本文,读者可以了解到C++中三角函数的基本用法和应用场景。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • yii2 绑定框架事件
    后端开发|php教程php,yii2后端开发-php教程我想要添加自定义代码处理yii2框架的Application::EVENT_BEFORE_REQUEST时触发的事件,但是不 ... [详细]
  • java.lang.Class.getDeclaredMethod()方法java.lang.Class.getDeclaredMethod()方法用法实例教程-方法返回一个Met ... [详细]
  • 原标题:Python中numpy.power()函数介绍Python中numpy.power()函数介绍power(x,y)函数, ... [详细]
  • clickhouse 二(springboot+mybatis配置clickhouse,实现插入查询)
    原标题:clickhouse二(springboot+mybatis配置clickhouse,实现插入查询)开发步骤 ... [详细]
author-avatar
暂时不用的微博
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有