动态数组构建与动态内存分配

一、静态数组的缺点

1.静态数组的长度必须事先指定,且数组长度只能是长整数,不能是变量。
2.给静态数组分配的内存无法手动释放,直到程序运行完毕,数组占用的内存空间才会被系统释放。
3.数组长度一旦固定,其长度就不能再更改。
4.静态数组不能跨函数调用

二、动态内存分配

为什么需要动态内存分配?
因为通过动态内存分配构建动态数组很好的解决了静态数组的4个缺点。

对内存的动态内存分配主要是通过系统提供的库函数来实现的,主要有 malloc, calloc, free, realloc这4个函数。

例: 使用malloc函数

C语言代码

#include <stdio.h>
#include <malloc.h>     //malloc函数头文件 

int main(void)
{

	int *p = (int *)malloc(4);
	/*
	1. 要使用malloc函数,必须添加malloc.h这个头文件
	2. malloc函数只有一个形参,并且形参是整型
	3. 4表示请求系统为本程序分配4个字节
	4. malloc函数只能返回第一个字节的地址
	5. 分配了8个字节, p变量占4个字节, p所指向的内存也占4个字节
	6. p本身所占的内存是静态分配的, p所指向的内存是动态分配的   	
    */
    
	*p = 5; 				// *p 代表的就是一个int变量, 只不过*p这个整型变量的是动态分配的 
	printf("%d\n", *p);
	free(p);                /*   freep(p)表示把p所指向的内存给释放掉  p本身的内存是静态的,不能手动释放,
	                         p本身的内存只能在p变量所在的函数运行终止时由系统自动释放 */ 
	printf("%d\n", *p);     //释放后,内存中为垃圾值 
	
	return 0;
}

devc运行结果
在这里插入图片描述

三、动态一维数组构建

//动态构建一维数组
#include <stdio.h>
#include <malloc.h>

int main(void)
{
	int len, i;
	int *p;
	//动态构建一维数组 
	printf("please enter the number: ");
	scanf("%d", &len);
	p = (int *)malloc(4 * len);           /* 动态构建一个一维数组,数组长度为len ,数组名为p,
											数组元素类型为int型,类似于int p[len]*/ 
	
	//对一维数组进行赋值 
	printf("please enter array value: ");
	for (i = 0; i < len; i++)
		scanf("%d", &p[i]);
		//scanf("%d", p+i);
	
	//对一维数组进行输出	
	printf("output array value: ");
	for (i = 0; i < len; i++)
		printf("%d ", p[i]);
		//printf("%d ", *(p+i));
	printf("\n");
	
	//释放动态分配的数组 
	free(p);                         
	
	return 0;
} 

devc运行结果
在这里插入图片描述

补充:一个指针变量到底占几个字节

例如:
char *p,p是指向char类型的指针变量,占1个字节。
int *q,q是指向int类型的指针变量,占4个字节。
double *r,r是指向double类型的指针变量,占8个字节。

p,q,r所指向的变量所占字节数不同,但p,q,r本身所占字节数是相同的。
在32位系统中,一个指针变量本身占4个字节,在64位系统中,一个指针变量本身占8个字节


#include <stdio.h>

int main(void)
{
	char ch = 'A';
	int i = 99;
	double x = 66.6;
	char *p = &ch;
	int *q = &i;
	double *r = &x;

	printf("%d %d %d\n", sizeof(p), sizeof(q), sizeof(r)); 		//输出p,q,r本身所占字节 
	printf("%d %d %d\n", sizeof(*p), sizeof(*q), sizeof(*r)); 	//输出p,q,r指向的变量所占字节 
	
	return 0;
}

运行结果
在这里插入图片描述

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值