服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言动态数组详解

C语言动态数组详解

2022-01-05 13:23江锋渔火 C/C++

本文给大家分享的是一则使用C语言实现动态数组的代码,完美解决内存溢出以及内存回收问题,有需要的小伙伴可以参考下

内存分配函数malloc calloc realloc free

堆内存分配函数 说明
void * malloc(int n) 形参n为要求分配的字节数。需要注意的是,malloc函数分配得到的内存空间是未初始化的。必须使用memset函数来初始化。
calloc(10, sizeof(char)); 两个参数:单元数,单元的size。分配内存,并清理内存。初始内容全部为0;
realloc(p,10); 调整内存的大小; 分配的内存空间并未初始化;使用新返回的地址,
free(void * p) 释放指针p所指向的堆上的空间;

malloc() 不对分配的内存空间做初始化,内存上原有的值不会被清理。

realloc(),在原有内存基础之上,在堆中间增加连续的内存,如果原有内存没有连续空间可扩展,则新分配一个空间,将原有内存copy到新空间,然后释放原有内存。

?
1
2
3
4
5
p = malloc(10); //直接申请4k的空间。内存页大小。  返回值是无类型指针void *,可以强制转换。
free(p);
char *p = calloc(10, sizeof(char));  //两个参数:单元数,单元的size。        分配内存,并清理内存
char *p2 = realloc(p,10);       // 在原有内存基础之上,在堆中间增加连续的内存,如果原有内存没有连续空间可扩展,则新分配一个空间,将原有内存copy到新空间,然后释放原有内存。
char *p2 = realloc(NULL,20);    //此时,和malloc等价

realloc和malloc一样,只分配内存,不清理,需要手动初始化。

// 复杂数据内存放在堆里面

内存操作函数 memset memcpy memmove

?
1
2
3
4
memset(buf,0,sizeof(buf));//三个参数分别是:要设置的内存地址,要设置的值,值占的内存的字节数。   将一块内存初始化为0最长见的方法。
extern void *memset(void *buffer, int c, int count)
memcpy(void *dest,void *src,unsigned int count);//将buf1的地址的内存内容全部拷贝到buf2,拷贝大小为第三个参数:字节一定确保内存区域没有内存区域重叠。
memmove(buf2, buf1, sizeof(buf1));//内存移动,并没有改变原始内存的值。 

二维动态数组的建立和释放

在创建动态数组的过程中我们要遵循一个原则,那就是在创建的时候从外层往里层,逐层创建;
而释放的时候从里层往外层,逐层释放。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
int main()
{
    int num1,num2;
    num1 = 4;
    num2 = 5;
    int **array = (int **)calloc(num1,sizeof(int *));//开辟空间,num1个一维int*型指针
    for(int i=0;i<num1;i++)
    {
        array[i] = (int *)calloc(num2,sizeof(int));     //给每个int *型指针分配内存
    }
    for(int i=0;i<num1;i++)
    {
        for(int j=0;j<num2;j++)
        {
            array[i][j] =i*num2+j+1;
            printf("%d\t",array[i][j]);
        }
        printf("\n");
    }
    for(int i=0;i<num1;i++)
    {
        free(array[i]);     // 释放第二维的内存
    }
    free(array);            // 释放第一维的内存
    return 0;
}

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!

原文链接:https://blog.csdn.net/weixin_40877998/article/details/120244800

延伸 · 阅读

精彩推荐
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22