指针学习十三——指针动态分配内存

动态内存分布函数

定义在stdlib.h里

  • 1.动态存储分配函数malloc( )

void *malloc(unsigned size)
再内存的动态存储中分配一连续空间,长度为size。申请成功,返回指向所分配内存空间的
的起始地址的指针;否则返回NULL;
//动态分配n个整数类型大小的的空间,调用malloc时,利用sizeof计算存储块大小
    if((p= (int *)malloc(n*sizeof(int)))==NULL){
    printf("Not able to allocate memory, \n");
    exit(1);
    }

  • 2.计数动态存储分配函数calloc( )

void *calloc(unsigned n,unsigned size)
在内存的动态存储区中分配n个连续空间,每一存储空间的而长度为size,并且分配后还把存储块
里全部初始化为0。申请成功,返回指向所分配内存空间的的起始地址的指针;否则返回NULL;

  • 3.动态存储释放函数free()

viod free(void *ptr)
盛放动态存储分配函数申请到的整块内存空间,ptr为指向要释放空间的首地址。
释放后不允许再通过该指针去访问已经释放的块。

  • 4.分配调整函数realloc()

void *realloc(void *ptr,unsigned size)
更改以前的存储分配。ptr必须是以前通过动态存储分配得到的指针。参数size为现在
需要的空间大小。分配失败,返回NULL;分配成功,返回一片能存放大小为siza的区块。

 

//动态分派内存指针求和
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n,sum,i,*p;
	printf("enter n: ");
	scanf("%d",&n);
	//为数组p动态分配n个整数类型大小的空间
	//动态内存申请的是一个没有名字、只有首地址的连续存储空间 
	if((p=(int *)calloc(n,sizeof(int)))==NULL)//申请存放n个int型数据的内存单元 
	{
		printf("not able to allocate memory.\n");
		exit(1);
	}
	printf("enter %d intergers:",n);
	for(i=0;i<n;i++)
		scanf("%d",p+i);
	sum=0;
	for(i=0;i<n;i++)
		sum=sum+*(p+i);
	printf("The sum is %d \n",sum);
	free(p); //动态存储释放函数 

	return 0;
}

//enter n: 5
//enter 5 intergers:1 2 3 4 5
//The sum is 15


//动态分配内存指针冒泡排序,有点问题,后续改正
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int n,i,j,m,k,*p;
	
	printf("enter n: ");
	scanf("%d",&n);
	p= (int *)calloc(n,sizeof(int));
	if(p==NULL)
	{
		printf("Not able to allocate memory, \n");
		exit(1);
	}
	printf("enter %d intergers:",n);
	for(i=0;i<n;i++)
		scanf("%d",p+i);
	for(j=1;j<n;j++){
		for(k=0;k<n-j;k++){
			if(*(p+j)>*(p+j+1)){
			m=*(p+j);
			*(p+j)=*(p+j+1);
			*(p+j+1)=m;
			}	
		}
	}
	for(i=0;i<n;i++)
		printf("%d ",*(p+i));	
	printf("\n");
	
	free(p); 
	
	return 0;
} 	

//enter n: 5
//enter 5 intergers:5 4 3 2 1
//5 3 2 1 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值