C语言的内存分配有三种方式,即静态分配、动态分配以及在栈上创建。
静态分配一般是在已知道数据量大小的情况下使用。
动态分配是程序在运行期间根据实际需要动态地申请或释放内存的方式。动态内存分配不是像数组等静态内存分配方式那样需要预先分配存储空间,而是由系统根据程序的需要即时分配,且所分配空间的大小也是根据程序的需要。
1.使用动态内存分配至少有以下三个优点
(1)可以更加有效地使用内存。
(2)同一段内存可以作为不同的用途,使用时申请,用完后释放。
2.进行动态内存分配时要注意以下几点
(1)确切地规定需要多少内存空间,以避免内存空间的浪费,也可以为其他数据预留一部分空间。
(2)利用C编译系统提供的动态分配函数来分配所需要的存储空间。
(3)使指针指向获得的内存空间,以便利用指针在该空间内实施运算或操作。
(4)当动态内存使用完毕之后,一定要释放该空间,否则可能把堆中的内存用完。
3.常用的动态内存分配函数
(1)动态内存分配函数malloc()
malloc()函数用于向内存申请分配一个连续的存储空间。若申请成功,则返回一个指向该存储空间起始地址的指针;若内存空间不足,申请失败,则返回空指针NULL。
函数原型:
void*malloc(unsigned size);
其中,size为申请的存储空间的字节数,mallloc()函数的返回值为void类型的指针,在具体应用中,可将该函数的返回值转换为指定的数据类型。
申请500个float型数据的动态内存,可以使用以下代码段来实现:
float*p;
p=(float*)malloc(500*sizeof(float));
if(p==NULL)
exit(1);
如果申请成功,可以得到供500个实型数据分配的动态内存的起始地址,并把此起始地址赋给指针变量p,利用该指针就可以对该区域里的数据进行操作或运算。若申请不成功,则退出程序,返回操作系统。
(2)计数动态内存分配函数calloc()
calloc()函数用于申请分配n个连续的存储区域,每个存储区域的长度为size个字节,并且将所分配的空间初始化为零。若申请成功,则返回一个指向该空间起始地址的指针;若申请失败,则返回空指针NULL。
函数原型:
void*calloc(unsigned,unsigned size);
例如:
int*p;
if((p=(int*)calloc(50,sizeof(int)))==NULL)
{
printf("内存分配失败!");
exit(1);
}
(3)内存分配调整函数realloc()
realloc()用于变更已分配内存空间的大小。realloc可以将指针p所指向的空间扩展或缩小为size大小的空间。如果变更成功,则返回一片大小为size的空间。
函数原型:
void*realloc(void*p,unsigned size);
无论是扩展或是缩小,原有内存中的内容将保持不变。对于缩小空间,则被缩小的那一部分空间的内容不变。例如:
int*p=(int*)malloc(500*sizeof(int));
p=(int*)realloc(p,150*sizeof(int)) //扩展150个整数的存储空间
p=(int*)realloc(p,150*sizeof(int)) //缩小150个整数的存储空间
(4)动态内存释放函数free()
free()函数可以看作malloc()函数的逆函数,它把malloc()函数原先申请的内存空间交还给系统。内存被交还后,以后的malloc()函数调用依然可以再次使用它。
函数原型:
void free(void*p);
其中,p是指向先前使用malloc()分配的内存的指针。由于函数没有返回值,故定义为void型的。这里要注意的是:绝对不能用无效指针调用free()函数,否则将破坏自由表。
【例7.29】利用动态内存分配函数实现字符串的动态分配。
程序内容如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 void main()(www.xing528.com)
5 {
6 char*s;
7 int t;
8 if((s=(char*)malloc(50))==NULL)
9 {
10 printf("内存分配失败!");
11 exit(1);
12 }
13 gets(s);
14 for(t=strlen(s)-1;t>=0;t--)
15 putchar(s[t]);
16 printf("\n%d\n",s);
17 free(s);
18 printf("释放内存!");
19 }
程序结果如图7.35所示:
图7.35 例7.29程序结果图
【例题中关键问题说明】
(1)第8行使使用malloc为字符串s分配50个字节动态空间。
(2)第14、15行通过循环反向输出字符串s。
(3)第17行释放内存。
【例7.30】先输入一个正整数,再输入任意n个整数,计算并输出这n个整数的和。
程序内容如下:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 void main()
5 {
6 int n,sum,i,*p;
7 printf("输入n:");
8 scanf("%d",&n);
9 if((p=(int*)calloc(n,sizeof(int)))==NULL)
10 {
11 printf("内存分配失败!\n");
12 exit(1);
13 }
14 printf("请输入n个整数:\n",n);
15 for(i=0;i<n;i++)
16 scanf("%d",p+i);
17 sum=0;
18 for(i=0;i<n;i++)
19 sum=sum+*(p+i);
20 printf("%d个整数之和是%d\n",n,sum);
21 free(p);
22 }
程序结果如图7.36所示:
图7.36 例7.30程序结果图
【例题中关键问题说明】
(1)第9行使使用malloc为整型指针变量p分配变量n的数据的字节动态空间。
(2)第18、19行通过循环使输入的n个数不断相加,得到最终结果。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。