C语言动态数组详解

 更新时间:2021年09月12日 16:27:43   作者:江锋渔火  
本文给大家分享的是一则使用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到新空间,然后释放原有内存。

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

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));//内存移动,并没有改变原始内存的值。  

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

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

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;
}

总结

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

相关文章

  • 浅析如何在c语言中调用Linux脚本

    浅析如何在c语言中调用Linux脚本

    如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
    2013-08-08
  • C++临时性对象的生命周期详细解析

    C++临时性对象的生命周期详细解析

    临时性对象的被摧毁,应该是对完整表达式(full-expression)求值过程中的最后一个步骤。该完整表达式造成临时对象的产生
    2013-09-09
  • C/C++实现动态库动态加载

    C/C++实现动态库动态加载

    在很多项目中,我们多少会用到第三方动态库,这些动态库一般都是相对固定,使用也很简单,下面我们就来看看c/c++中如何实现动态库动态加载吧
    2024-01-01
  • C++统计中英文大小写字母、数字、空格及其他字符个数的方法

    C++统计中英文大小写字母、数字、空格及其他字符个数的方法

    这篇文章主要介绍了C++统计中英文大小写字母、数字、空格及其他字符个数的方法,涉及C++字符串的遍历与简单判定技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-05-05
  • 初学C语言基本运算和表达式

    初学C语言基本运算和表达式

    在本文里小编给大家分享的是关于C语言基本运算和表达式的相关知识点,需要的朋友们跟着学习下。
    2019-08-08
  • C语言的语法风格与代码书写规范指南

    C语言的语法风格与代码书写规范指南

    这篇文章主要介绍了C语言的语法风格与代码书写规范指南,文中主张了一些诸如变量和结构体的命名规范等细节方面的问题,需要的朋友可以参考下
    2016-02-02
  • C语言动态数组详解

    C语言动态数组详解

    本文给大家分享的是一则使用C语言实现动态数组的代码,完美解决内存溢出以及内存回收问题,有需要的小伙伴可以参考下
    2021-09-09
  • C++算法设计之马踏棋盘的实现

    C++算法设计之马踏棋盘的实现

    这篇文章主要为大家详细介绍了C++算法设计之马踏棋盘的实现,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C语言变量类型与输出控制用法实例教程

    C语言变量类型与输出控制用法实例教程

    这篇文章主要介绍了C语言变量类型与输出控制用法,是C语言程序设计中比较基础也是比较重要的用法,需要的朋友可以参考下
    2014-08-08
  • C/C++堆区专篇精讲

    C/C++堆区专篇精讲

    一直以来总是对这个问题的认识比较朦胧,我相信很多朋友也是这样的,总是听到内存一会在栈上分配,一会又在堆上分配,那么它们之间到底是怎么的区别呢,让我们一起来看看
    2022-10-10

最新评论