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

目录
  • 动态分配一个二维字符串数组
  • (1) 分配可能不连续的内存
    • 申请
    • 释放
    • 完整demo:
  • (2) 分配连续的内存
    • 申请
    • 释放
    • 完整demo:
  • (3) 将二维字符串数组看成一维字符串数组
    • 申请
    • 释放
    • 完整demo:

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

(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语言动态分配字符串数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • c语言中用字符串数组显示菜单的解决方法

    以前写菜单方面东西时往往重复, 发现这个方法还可以, 用一个指针的指针解决遍历问题.代码如下所示: 复制代码 代码如下: #include <stdio.h>static char *menu[] = {  "1 --- push one item./n",  "2 --- pop one item./n",  "3 --- quit./n",  NULL};void Show_menu();int main(){ Show_menu

  • 详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法

    详解Swift中对C语言接口缓存的使用以及数组与字符串转为指针类型的方法 由于Swift编程语言属于上层编程语言,而Swift中由于为了低层的高性能计算接口,所以往往需要C语言中的指针类型,由此,在Swift编程语言刚诞生的时候就有了UnsafePointer与UnsafeMutablePointer类型,分别对应为const Type*类型与Type *类型. 而在Swift编程语言中,由于一般数组(Array)对象都无法直接用于C语言中含有指针类型的函数参数(比如:void*),所以往往需要

  • IOS开发之路--C语言数组和字符串

    概览 数组在C语言中有着特殊的地位,它有很多特性,例如它的存储是连续的,数组的名称就是数组的地址等.而在C语言中是没有String类型的,那么如果要表示一个字符串,就必须使用字符串数组.今天主要就介绍如下三个方面: 一维数组 多维数组 字符串 一维数组 一维数组操作比较简单,但是需要注意,数组长度必须是固定的,长度不能使用变量进行初始化:如果声明的同时进行赋值则数组长度可以省略,编译器会自动计算数组长度:同时数组不能先声明再一次性赋值(当然可以对每个元素一一赋值). #include <stdi

  • C语言字符串数组详解

    C语言字符串数组 字符串是连续的字符序列,最后以空字符'\0'作为终止符.一个字符串的长度指所有字符的数量,但不包括终止符.在 C 语言中,没有字符串类型,自然也就没有运算符以字符串为操作数. 字符串被存储在元素类型为 char 或宽字符类型数组中(宽字符类型指 wchar_t.char16_t 或 char32_t).宽字符组成的字符串也称为宽字符串(wide string). C 标准库提供了大量的函数,它们可以对字符串进行基本操作,例如字符串的比较.复制和连接等.在这些传统的字符串函数以外

  • c语言字符数组与字符串的使用详解

    1.字符数组的定义与初始化字符数组的初始化,最容易理解的方式就是逐个字符赋给数组中各元素.char str[10]={ 'I',' ','a','m',' ','h','a','p','p','y'};即把10个字符分别赋给str[0]到str[9]10个元素如果花括号中提供的字符个数大于数组长度,则按语法错误处理:若小于数组长度,则只将这些字符数组中前面那些元素,其余的元素自动定为空字符(即 '\0' ). 2.字符数组与字符串在c语言中,将字符串作为字符数组来处理.(c++中不是)在实际应用

  • 详解C语言中的字符串数组

    在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <stdio.h> #include <string.h> //该程序的功能是 输入阿拉伯数字的月份数 输出英文月份 int main() { //一个字符串数组 它的下标代表英文月份的阿拉伯数字 char *month[] = {"January","Februa

  • C语言字符串替换:字符,字符串,字符数组详解

    目录 案例描述 案例分析 必备知识 1,字符数组 (1)字符数组的定义 (2)字符数组的初始化 2,字符串概念 (1)字符串的概念 (2)用字符初始化字符数组 (3)获取字符串的长度 3,字符串与指针 4,字符数组与字符指针 总结 案例描述 字符串替换是处理字符串时最常见的操作之一,也是学习字符串必须掌握的知识.本案例要求通过编程实现字符串"Good moring"到"Good evening"的转换. 案例分析 我们需要从字符串中被替换的位置开始,将要替换的内容逐

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

    目录 动态分配一个二维字符串数组 (1) 分配可能不连续的内存 申请 释放 完整demo: (2) 分配连续的内存 申请 释放 完整demo: (3) 将二维字符串数组看成一维字符串数组 申请 释放 完整demo: 动态分配一个二维字符串数组 (1) 分配可能不连续的内存 申请 char**pps8Output = (char **) malloc(n * sizeof(char *)); 对于pps8Output而言,它获得了一块动态分配的连续内存,这块连续的内存可以放n个char *指针.

  • php实现将二维关联数组转换成字符串的方法详解

    本文实例讲述了php实现将二维关联数组转换成字符串的方法.分享给大家供大家参考,具体如下: 需求 项目中遇到了二维关联数组转字符串的问题,查阅相关资料,写了如下程序,并且能过滤重复的关键字. 举例,php的二维数组如下: $name = array( "self" => "wangzhengyi", "student" => array( "chenshan", "xiaolingang" ),

  • C与C++动态分配二维数组的实现方法

    C: C中使用函数malloc和free两个函数. //动态分配M*N维 int **a=(int **)malloc(sizeof(int*)*M); for(int i=0;i<M;i++) a[i]=(int *)malloc(sizeof(int)*N); //动态释放 for(int j=0;j<M;j++) free(a[i]); free[a]; C++: C++ 使用关键字new和delete. //动态分配M*N维 int **a=new int *[M]; for(int

  • 详解C语言用malloc函数申请二维动态数组的实例

    详解C语言用malloc函数申请二维动态数组的实例 C语言在程序运行中动态的申请及释放内存十分方便,一维数组的申请及释放比较简单. Sample one #include <stdio.h> int main() { char * p=(char *)malloc(sizeof(char)*5);//申请包含5个字符型的数组 free(p); return 0; } 是否申请二维动态内存也如此简单呢?答案是否定的.申请二维数组有一下几种方法 Sample two /* 申请一个5行3列的字符型

  • Go语言实现二维数组的2种遍历方式以及案例详解

    二维数组遍历的2种方式: package main import ( "fmt" ) func main() { //定义一个二维数组 var arr = [2][3]int{{1, 4, 3},{7, 5, 6}} //方式1. 用for循环来遍历 for i := 0; i < len(arr); i++ { for j := 0; j < len(arr[i]); j++ { fmt.Printf("%v ",arr[i][j]) } fmt.Pr

  • Python实现二维有序数组查找的方法

    本文实例讲述了Python实现二维有序数组查找的方法.分享给大家供大家参考,具体如下: 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 这题目属于比较简单但又很不容易想到的,问了两个同学,大家一时都没有想出来怎么解决比较快.第一反应都是二分查找.对于每一行进行二分查找,然后查找过程可以把某些列排除掉,这是大家都能想到的基本的思路. 比较好的另一种思路是,首先选取数组右上角

  • PHP二维索引数组的遍历实例分析【2种方式】

    本文实例讲述了PHP二维索引数组的遍历.分享给大家供大家参考,具体如下: 二维索引数组的遍历方式,话不多说,直接看代码. 实例一. <?php $arr = array(//定义外层数组 array(1,'高某','A公司','北京市','(010)987654321','gm@Linux.com'),//子数组1 array(2,'洛某','B公司','上海市','(021)123456789','lm@apache.com'),//子数组2 array(3,'峰某','C公司','天津市',

  • PHP二维关联数组的遍历方式(实例讲解)

    采用foreach循环对二维索引数组进行遍历,相对来讲速度更快,效率更高,foreach循环是PHP中专门用来循环数组的. 实例也相对简单,多加练习,想清楚程序运行逻辑即可. <?php $arr = array(//定义外层数组 "北京负责人"=>array(1,'高某','A公司','北京市','(010)987654321','gm@Linux.com'),//子数组1 "上海负责人"=>array(2,'洛某','B公司','上海市','(

  • PHP 二维关联数组根据其中一个字段排序(推荐)

    PHP 中二维关联数组如何根据其中一个字段进行排序,下面的代码将二维关联数组 $array 根据 $orderby 字段进行排序: function wpjam_array_multisort($array, $orderby, $order = SORT_ASC, $sort_flags = SORT_NUMERIC){ $refer = array(); foreach ($array as $key => $value) { $refer[$key] = $value[$orderby];

  • 学习二维动态数组指针做矩阵运算的方法

    本文分享了利用二维动态数组指针做矩阵运算的实现代码. 1. 头文件 // juzhen 2.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "stdlib.h" #include "windows.h" #define OK 0 #define NG -1 typedef struct mat { int nRow

随机推荐