动态内存

1、存储区

静态存储区和动态存储区统称为栈
内存动态分配区域称为堆。动态分配区可以存放一些临时用的数据,不需要在程序声明部分定义,也不许要在函数结束时才释放,可以随时开辟,随时释放。该区域只能通过指针来引用。

2、建立内存的动态分配

这些函数全部在头文件stdlib.h文件中。

(a)malloc()函数

函数原型:

void *malloc(unsigned int size);

作用:

在内存的动态存储区中分配一个长度为size的连续空间,单位为字节。

返回值:

函数返回值是所分配区域的第一个字节的地址(一个指针)。
该指针的基类型是void,不指向任何类型,只提供一个纯地址,与一般的指针不同。如果申请内存失败,则返回NULL。后期在使用时,需要将void转为其他类型。

(b)calloc()

函数原型

void *calloc(unsigned int n,unsigned int size);

作用:

在内存的动态存储区分配n个长度为size的连续空间。可以用来给一维数组开辟动态存储空间,n为数组元素个数,size为数组基类型的长度,这就是一个动态数组。

返回值:

返回所分配区域的第一个字节的指针,分配不成功则返回NULL。

(c)realloc()

函数原型:

void *realloc(void *p,unsigned int size);

作用:

如果已经使用malloc()或calloc()函数获得了动态空间,想改变大小则可以使用realloc()重新分配。用realloc()将p指向的动态空间的大小改变为size。p的值不变

p=calloc(40,4);
realloc(p,50);

(d)free()

函数原型:

void free(void *p);

作用:

释放指针变量p所指向的动态空间。

3、void* 指针类型

以void为基类型的指针意味着指向空类型不指向确定的类型。
首先要理解c语言中地址的含义,基类型+物理地址。基类型转变为void不代表数据没了,而是指指一个指针指向的地址中存放的数据没有确定类型,是纯粹的二进制数
因此,可以将任意指针转变为(void *)类型,也可以将(void *)类型转变为任意类型的指针。

int main(){
    int a=3;
    int *p1=&a;
    char *p2;
    void *p3;
    p3=(void *)p1;		//将int *p1指针转换为void *类型,然后赋值给p3
    p2=(char *)p3;		//将void *p3指针转换为char *类型,然后赋值给p2
    /*这样以后实际上三个指针指向了同一个地址,但是基类型不同。*/
    printf("%d\n",*p1);
    printf("%c\n",*p2);
    printf("%d\n",*(int *)p3);
    return 0;
}

使用动态内存函数时,将返回基类型设置为void *。因此我们在使用时,可以对指针类型进行相应的转换。

int *p;
p=int *malloc(100);		//将void *类型指针转换为int *类型指针

实际上现在的编译系统都可以自动转换类型。

int *p;
p=malloc(100);		//可以省略强转的步骤

但是为了减少错误,还是需要加强转步骤。

4、使用例子

#include<stdio.h>
#include<stdlib.h>
int main(){
	int *p1,i;
	p1=(int *)malloc(5*sizeof(int));//不同系统中int字节数不同,可以用sizeof()
	for(i=0;i<5;i++)
		scanf(%d”,p1+i);
	int *p1_end=p1+4;
	for(;p1<=p1_end;p1++)
		printf(%d ”,p1);
	printf(“\n”);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值