C语言动态分配二维字符串数组的方法

 更新时间:2021年10月27日 11:58:44   作者:谁吃薄荷糖  
小编最近忙里偷闲,给大家整理一份教程关于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<stdio.h>
#include<stdlib.h>

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: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语言动态分配二维字符串数组的文章就介绍到这了,更多相关C语言动态分配字符串数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++课程设计之运动会管理系统

    C++课程设计之运动会管理系统

    这篇文章主要为大家详细介绍了C++课程设计之运动会管理系统,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • C++11 thread多线程编程创建方式

    C++11 thread多线程编程创建方式

    这篇文章主要介绍了C++11 thread多线程编程的相关知识,包括线程的创建方式结束方式及互斥锁的实例代码详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • 关于C语言中弱符号与弱引用的实际应用问题

    关于C语言中弱符号与弱引用的实际应用问题

    在编码过程中,我们经常遇到符号重定义的错误问题,本文通过实例代码展示给大家介绍了C语言弱符号与弱引用的实际应用问题,一起看看吧
    2021-09-09
  • C语言递归宏的具体使用

    C语言递归宏的具体使用

    本文介绍了阶段进行多次符号替换,从而模拟递归效果,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-11-11
  • C语言的基本编写规范你了解吗

    C语言的基本编写规范你了解吗

    这篇文章主要为大家介绍了C语言的基本编写规范,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • C语言最大公约数示例教程

    C语言最大公约数示例教程

    这篇文章主要为大家介绍了C语言最大公约数的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2021-11-11
  • C语言使用顺序表实现电话本功能

    C语言使用顺序表实现电话本功能

    这篇文章主要为大家详细介绍了C语言使用顺序表实现电话本功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • C++重载的奥义之运算符重载详解

    C++重载的奥义之运算符重载详解

    函数的重载是指利用相同的函数名设计一系列功能相近,但是功能细节不一样的函数接口;因此运算符重载也是指对于同一个运算符来说,它可以用于实现不同的功能。下面就一起来理解下运算符重载的应用吧
    2023-04-04
  • C++右移运算符的一个小坑及解决

    C++右移运算符的一个小坑及解决

    文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数
    2025-09-09
  • 教你分辨C++堆与栈的区别

    教你分辨C++堆与栈的区别

    堆与栈的区别有:1、栈由系统自动分配,而堆是人为申请开辟;2、栈获得的空间较小,而堆获得的空间较大;3、栈由系统自动分配,速度较快,而堆一般速度比较慢;4、栈是连续的空间,而堆是不连续的空间
    2021-06-06

最新评论