二维数组的动态申请

   在一个C语言学习群偶然遇到一个初学者问了一个关于二维数组动态分配的问题,当时接近夜里12点,我已经上床准备睡了,就随便给他说了几句,他说还是不行也就没在管,第二天中午午休过后觉得这个问题不解决心里有点不好受,就上手写了下。原问题如下:
为什么出错了,,没有输出

  我看出了他的malloc错了,我的想法是总共有6*30个char所以我写了如下代码:

从这里可以看出我对于二维数组的理解是连续的一块内存,我以为二维数组跟一维数组一样是连续的,把内存的首地址给这个二级指针就可以正常使用了,但是我错了。经过一系列的讨论和验证终于理清了二维数组的结构,实际上二维数组可以看成是由若干个一维数组组成的,这其实大家都可以理解,关键是二维数组的外层还有一个数组,他所存储的是下面那些一维数组的首地址,故二维数组需要的空间就不止sizeof(char)*3*30了,还要包含三个指针sizeof(char *)*3;还有一个需要注意的地方是,虽然我们申请了这些空间但是他们仍然是毫无关联的一些内存块,要想将二级指针像二维数组名一样使用我们还得将指针和一维数组关联起来这样才能够正常使用。所以二维数组的动态分配第一步是分配内存,第二步是关联指针。需要说明的一点是二维数组拷贝也要分级拷贝。下面是一种二维数组的动态分配的方法,供大家参考:
#include <stdio.h>
#include <stdlib.h>                     
#include <string.h>

void function(char ** ptr)              
{
    char arr[3][30] =  {
        "abc",
        "def",
        "ghi"
    };
    int i = 0;

    for(i = 0; i < 3; i++)
        memcpy(ptr[i], arr[i], sizeof(char)*30);
}
int main()
{
    int i = 0;
    int j = 0;
    //printf("hello word\n");
    char **ptr = NULL;

    ptr = (char **)malloc(sizeof(char *)*3);

    for(i = 0; i < 3; i++)
        *(ptr+i) = (char *)malloc(sizeof(char)*30);

    function(ptr);

#if 1
    for(i  = 0; i < 3; i++)
        printf(" %s \n", ptr[i]);
#endif


    for(i = 0; i < 3; i++)
        free(ptr[i]);
    return 0;
}
二维数组虽然我们说他是不连续的空间。但是如果你愿意也可以尝试如下做法,将二维数组变成一个连续的内存块,但是其原理没有变仍然需要将指针和一维数组关联,只不过认为的将内存挪到了一起。代码如下:

欢迎加入C语言交流群 461097775
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安静的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值