动态存储--堆分配--数组

来源:互联网 发布:java简单小游戏 编辑:程序博客网 时间:2024/05/21 11:27

动态数组
动态数组是相对于静态数组而言,静态数组的长度是预先定义好的,在整个程序中,一旦给定大小后就无法改变。而动态数组则不然,它可以随程序需要而重新指定大小。动态数组的内存空间是从堆动态分配的。是通过执行代码而为其分配存储空间。当程序执行到我们编写的分配语句时,才为其分配。对于静态数组,其创建非常方便,使用完也无需释放,要引用也简单,但是创建后无法改变其大小是其致命弱点!对于动态数组,其创建麻烦,使用完必须由程序员自己释放,否则将会引起内存泄露。但其使用非常灵活,能根据程序需要动态分配大小。

malloc 和calloc 和 realloc 的区别:

malloc和calloc(两者都是动态分配内存)
用malloc只分配空间不初始化,也就是依然保留着这段内存里的数据,而calloc则进行了初始化,calloc分配的空间全部初始化为0;

区别:主要的不同是malloc不初始化分配的内存,已分配的内存中可以是任意的值. calloc初始化已分配的内存为0。次要的不同是calloc返回的是一个数组,而malloc返回的是一个对象。

calloc:
函数calloc()会将所分配的内存空间中的每一位都初始化为零,也就是说,如果你是为字符类型或整数类型的元素分配内存,那麽这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那麽这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零。
realloc :
char *p;
p=(char *)realloc(p,sizeof(char)*n);
代码:

#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>#include<stdlib.h>using namespace std;int main(){    int n;    while(~scanf("%d",&n))    {        int *p;        p=(int *)malloc(n*sizeof(int));        for(int i=0; i<n; i++)        {            scanf("%d",&p[i]);        }        for(int i=0; i<n; i++)        {            printf("%d%c",p[i],i<n-1?' ':'\n');        }        free(p);    }}

malloc ——>free(p);
new———>delete p;

#include<cstdio>#include<algorithm>#include<iostream>#include<cstring>#include<stdlib.h>using namespace std;int main(){    int n;    while(~scanf("%d",&n))    {        int *p=new int [n];        for(int i=0;i<n;i++)        {            scanf("%d",&p[i]);        }        for(int i=0;i<n;i++)        {            printf("%d%c",p[i],i<n-1?' ':'\n');        }        delete p;    }}
原创粉丝点击