C语言如何动态分配二维字符串数组

技术C语言如何动态分配二维字符串数组这篇文章给大家分享的是有关C语言如何动态分配二维字符串数组的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。动态分配一个二维字符串数组(1) 分配可能不连续的内

本文是关于如何用C语言动态分配二维字符串数组。我觉得边肖挺实用的,就分享给大家参考,和边肖一起来看看。

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

C语言如何动态分配二维字符串数组

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

申请

char * * PPS 8 OutPut=(char * *)malloc(n * sizeof(char *);

对于pps8Output,它获得一个动态分配的连续内存,可以保存n个char *指针。

下面的malloc为每行分配内存,这样分配的内存不一定是连续的。

for(inti=0;在;(一)

{

PPS 8 output[I]=(char *)malloc(lens * sizeof(char));

}

释放

Released按照先malloc内存,后free的原则。

for(inti=0;在;(一)

{

免费(PPs8OutPut[I]);

}

免费(PPs8OutPut);该方法:

n行的每个字符串数组由malloc动态分配,因此整个二维字符串数组的内存可能是不连续的。

完整demo:

# includes dio . h

# includestdlib.h

int main(){ 0

int n=3;

intlens=10

char * * PPS 8 OutPut=(char * *)malloc(n * sizeof(char *);

///malloc

for(inti=0;在;(一)

{

PPS 8 output[I]=(char *)malloc(lens * sizeof(char));

printf(' PPS 8 OutPut[% d]ptr :% p \ r \ n ',I,PPS 8 OutPut[I]);

}

///免费

for(inti=0;在;(一)

{

免费(PPs8OutPut[I]);

}

免费(PPs8OutPut);

(=NationalBureauofStandards)国家标准局

p;  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 *));
    
    ///< 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: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));
    
    ///< 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

感谢各位的阅读!关于“C语言如何动态分配二维字符串数组”这篇文章就分享到这里了,希望

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/59858.html

(0)

相关推荐

  • 前端异步请求axios的介绍与用法

    技术前端异步请求axios的介绍与用法 前端异步请求axios的介绍与用法官网
    http://www.axios-js.com/
    axios是什么1.Axios是一个基于promise的HTTP库,可以

    礼包 2021年11月24日
  • python光学仿真面向对象光学元件类的实现是什么

    技术python光学仿真面向对象光学元件类的实现是什么python光学仿真面向对象光学元件类的实现是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能

    攻略 2021年10月20日
  • eolinkerhttp接口测试(eolinker测试本地接口插件)

    技术使用EOLINKER进行接口测试的最佳路径是什么这期内容当中小编将会给大家带来有关使用EOLINKER进行接口测试的最佳路径是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内容

    攻略 2021年12月24日
  • wei的成语,带wei(第一声)字的成语

    技术wei的成语,带wei(第一声)字的成语【危在旦夕】危险就在眼前。 【危如累卵】如垒起的蛋那样危险。喻极其危险。 【危言正色】刚直的言论和严正的态度。 【危言逆耳】正直的规劝听起来不顺耳。 【危言高论】正直而不同凡响

    生活 2021年10月20日
  • 有哪些常用的JS正则表达式

    技术有哪些常用的JS正则表达式本篇内容介绍了“有哪些常用的JS正则表达式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1

    攻略 2021年11月2日
  • 电脑的用户名和密码怎么查看,宽带用户名和密码怎么查看

    技术电脑的用户名和密码怎么查看,宽带用户名和密码怎么查看宽带用户名和密码查看方法如下电脑的用户名和密码怎么查看:1、首先打开浏览器,然后在地址栏输入路由器在的管理IP地址(地址如果不知道的话,可以看一下路由器背面一般都会

    生活 2021年10月30日