C语言基础学习Day9(连载中)

C语言基础学习(Day9)

笔者有话说:在前面的学习中,我们学习了指针的分类,第九天我们主要学习动态内存分配,以专题的形式对动态内存分配相关的知识点进行讲解。笔者依旧用通俗易懂的语言带领小白15天掌握C语言基本知识,打卡第九天~

专题:动态内存分配(重点难点)

(1)传统数组的缺点

数组长度必须事先指定,且只能是常整数,不能是变量。

举例

int a[5]; //ok

int len = 5; int a[len]; //error

②传统形式定义的数组,该数组的程序员无法手动释放。数组一旦定义,系统为该数组分配的存储空间就会一直存在除非数组所在的函数运行结束(或者说:在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组空间才会被系统释放)。

举例

void f(void)
{
int a[5] = {1, 2, 3, 4, 5};
//以上40个字节所占用的存储空间程序员无法手动编程释放它
//它只能在本函数运行完毕时由系统自动释放
}

③数组的长度一旦定义,其长度就不能再改变。数组的长度不能在函数运行的过程中动态的扩充或缩小。

A函数定义的数组,在A函数运行期间可以被其他函数使用,但A程序运行完毕之后,A函数中的数组将无法被其他程序使用。即:传统方式定义的数组不能跨函数使用。

(2)为什么需要动态分配内存

动态数组很好地解决了传统数组的这四个缺陷

Tip传统数组也叫静态数组

(3)动态内存分配举例:动态数组的构造

malloc函数的使用

Tip:malloc是memory(内存) allocate(分配) 的缩写

示例1

#include <stdio.h>
#include <malloc.h>	//不能省 

void f(void)
{
	int a[5] = {1, 2, 3, 4, 5};
	
}

int main(void)
{
	int i = 5;	//分配了4个字节,静态分配 
	int * p = (int *)malloc(4);		//13行 
	/*
		1.要使用malloc函数,必须添加malloc.h这个头文件
		2.malloc函数只有一个形参,并且形参是整形
		3.4表示请求系统为本程序分配4个字节
		4.malloc函数只能返回第一个字节的地址
		5.13行分配了12个字节:4 + 8 = 12 ,p变量占8个字节,p变量所指向的内存占4个字节
		6.p本身所占的内存是静态分配的,p所指向的内存是动态分配的 
	*/
	
	free(p);	//free(p)表示把p所指向的动态内存给释放掉
	//p本身的内存是静态的,不能由程序员手动释放,p本身的内存只能在p变量所在的函数运行终止时,由系统自动释放
	
	printf("同志们好!\n"); 
	return 0;
}

示例2

 #include <stdio.h>
    #include <malloc.h>
    
    void f(int * q)
    {
    	*q = 200;	
    }
    
    int main(void)
    {
    	int * p = (int *)malloc(sizeof(int));	
      //sizeof(int)返回值是int所占的字节数 
    	*p = 10;
    	printf("%d\n", *p);
    	
    	f(p);
    	printf("%d\n", *p); 
    	
    	return 0;
    }

动态数组构造

格式

pArr = (int *)malloc(4*len);

上述语句动态地构造了一个一维数组,该一维数组的长度是len,该数组的数组名是pArr,该数组的每个元素是int类型;类似于 int pArr[len]。

示例

 #include <stdio.h>
    #include <malloc.h>
    
    int main(void)
    {
    	int a[5];	//如果int占4个字节,则本数组共包含20个字节,每4个字节被当作一个int变量来使用
    	int len;
    	int * pArr;
    	int i;
    	
    	//动态地构造一维数组 
    	printf("请输入你要存放的元素个数:"); 
    	scanf("%d", &len);
    	pArr =  (int *)malloc(4 * len);
    	
    	//对一维数组进行操作,如:对一维数组进行赋值
    	for(i=0; i<len; ++i)
    		scanf("%d", &pArr[i]);
    	
    	//对一维数组进行输出
    	printf("一维数组的内容是:");
    	for(i=0; i<len; ++i)
    		printf("%d\t", pArr[i]);
    		
    	free(pArr);//释放被动态分配的数组 
    	
    	return 0;
    }

拓展动态地扩大或缩小内存,需要调用realloc函数,格式如:”realloc(pArr,100);”,此函数不必深入研究。

(4)静态内存和动态内存的比较

静态内存是由系统自动分配,由系统自动释放;静态内存是由分配的。

动态内存由程序员手动分配手动释放;动态内存是在分配的。

(5)跨函数使用内存

#include <stdio.h>
#include <malloc.h>

void f(int ** q)
{
	*q = (int *)malloc(sizeof(int));
	//sizeof(数据类型)返回值是该数据类型所占的字节数
	//int型变量所占字节数并不一定是4,C语言并没有规定int型变量占4个字节,在不同软件中所占字节数可以不一样
	
	//*q = 5;	//error, *q = p 
	**q = 5;	//等价于*p = 5, 成立 
}

int main(void)
{
	int * p;
	
	f(&p);
	printf("%d\n", *p);
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值