实现内存的动态与分配的函数

1.malloc()函数------动态分配一段内存空间

  • 函数原型:void *malloc(unsigned int size);
  • 功能:在内存的动态存储区申请一个长度为size字节的连续存储空间,malloc()函数会返回一个指针,并指向所分配存储空间的起始地址(无足够存储空间可分配
    函数的返回值类型为空指针NULL) 函数值为指针类型,由于基类型为void,若要将此指针值赋给其他类型的指针变量,应当强制类型转换


int *p=(int *)malloc(sizeof(int))
申请一个int 类型长度的存储空间,并将分配到的存储空间地址转换为 int 类型地址,赋给所定义的指针变量p

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int *pInt;//定义指针pInt并分配内存空间 
	pInt=(int *)malloc(sizeof(pInt));
	*pInt=100;//使用新空间保存数据 
	printf("%d\n",*pInt);
	free(pInt);
	printf("%d\n",*pInt);//保存数据的空间已被释放,数据不将存在,故输出一个不可预料的值 
	return 0;
 } 

2.calloc()函数--------动态分配连续内存空间

  • 函数原型:void *calloc(unsigned int n,unsigned int size);

  • 功能:在内存申请n个长度为size字节的存储空间,并返回该存储空间的起始地址
    主要用于为动态数组申请存储空间,n为元素的个数,size为元素存储长度

int *p=(int *)calloc(10,sizeof(int));
申请10个int 类型长度的存储空间,并将分配到的存储空间地址转换为 int 类型地址,将其首地址赋给所定义的指针变量p
此后 即可将p作为10个元素的整型数组使用,此数组无数组名,只能用指针变量p来访问,

也可用malloc()函数实现
int *p=(int *)malloc(sizeof(int)*10);

#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(char[26])
int main()
{
	int i;
	/*使用calloc动态分配一个长度为26字节的字符数组*/ 
	char *ch1=(char *)calloc(26,sizeof(char));
	/*使用malloc动态分配一个长度为26字节的字符数组*/ 
	char *ch2=(char *)malloc(LEN);
	for(i=0;i<26;i++)
	{
		ch1[i]=65+i;//小写字符数组 
		ch2[i]=97+i;//大写字符数组 
	 } 
	 printf("26个英文字母表:\n");
	 for(i=0;i<26;i++)
	 {
	 	printf("%c%c ",ch1[i],ch2[i]);
	 	if(i==12 || i==25)
	 	printf("\n");
	 } 
	 free(ch1);
	 free(ch2);
	 return 0;
 } 

3.realloc()------改变指针指向空间大小

  • 函数原型:void *realloc(void *ptr,size_t size);
  • 功能:改变ptr指针指向大小为size的空间,设定size的大小是任意的,返回值是一个指向新地址的指针

改变一个浮点型空间大小为整型大小
fDouble=(double *)malloc(sizeof(double)); 指向分配的浮点型空间
iInt=realloc(fDouble,sizeof(int));

realloc()函数改变fDouble指向空间的大小 将其大小设置为整型,然后将改变后的内存空间的地址返回赋值给iInt指针

#include<stdio.h>
#include<stdlib.h>
int main()
{
	short *s;
	double *f=(double *)malloc(sizeof(double));
	printf("指针f指向内存空间的起始地址:\n%d\n",f);//申请double变量所占内存空间 
	printf("指针f指向内存空间的大小:\n%d字节\n",sizeof(*f));//打印首地址
	s=(short *)realloc(f,sizeof(short));//重新分配内存
	printf("指针s指向内存空间的起始地址:\n%d\n",s);//打印首地址 
	printf("指针s指向内存空间的大小:\n%d字节\n",sizeof(*s));//打印空间大小 
	return 0;
}
//新分配的内存空间和原来的空间起始地址一样,但大小不同 

4.free()函数------释放内存空间

  • 原型:void free(void *p)
  • 功能:将指针变量p指向的存储空间释放,交还给系统,free()函数无返回值,
    p只能是程序中此前最后一次调用malloc()或calloc()函数所返回的地址
`int *p,*q=(int *)calloc(10,sizeof(int));
p=q;   q++;
free(p);     // 将p指向的,此前调用的calloc()函数申请的存储空间释放若改用free(q)则会提示错误,因为执行了q++,以后,q已改变,若改用free(q)则会提示错误,因为执行了q++,以后,q已改变
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int *pInt;//定义指针pInt并分配内存空间 
	pInt=(int *)malloc(sizeof(pInt));
	*pInt=100;//使用新空间保存数据 
	printf("%d\n",*pInt);
	free(pInt);
	printf("%d\n",*pInt);//保存数据的空间已被释放,数据不将存在,故输出一个不可预料的值 
	return 0;
 } 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值