C语言动态数组
if(p == NULL) {
puts(“存储空间分配失败!”); exit(0); }
calloc函数
2020年3月16日星期一
函数原型
void *calloc(unsigned int n,unsigned int size); 参数 n:元素的数量 size:每个元素需要的空间大小
这两个参数的乘积就是要分配的内存空间的大小。 功能
free函数
2020年3月16日星期一
函数原型 void free(void *p);
参数 p:要释放的内存区地址
说明 释放p指向的内存区 该函数无返回值 释放后的内存区能够分配给其他变量使用
2020年3月16日星期一
Problem G: 动态的数组 输入N个浮点数,输出其中第m个~第n个数,满足 m<n。 double* allocate(int n),在动态内存上分配n个元素的 double型数组,并返回其首地址。 void input(double* p, int n),向p中输入n个double型数 值。 void output(double* p, int n),把长度为n的数组p中符 合条件的第m个~第n个元素输出,m和n从标准输入 读取。 void release(double* p),释放p所指的动态内存空间。
2020年3月16日星期一
二维动态数组的实现(方法2)
2020年3月16日星期一
转化成一维数组处理! int *array,m,n,row,col; printf("please input array size m , n:\n"); scanf("%d,%d",&m,&n);
// 申请一维动态数组使用的内存块
printf("%lg\n",*(p+i-1));
}
[例] 输入m行n列的数据并输出
2020年3月16日星期一
由用户从键盘输入m行n列个整数,存入二维数组并输 出。
要求:用动态二维数组实现。
二维数组的理解
把二维数组a理解成 由3个元素组成的一维数组
例 int a[3][4];
a[0] a[0][0] a[0][1] a[0][2] a[0][3] a[1]
动态数组的实现
2020年3月16日星期一
静态数组:静态数组的长度是预先定义好的,在整个 程序中,一旦给定大小后就无法改变。静态数组, 其创建非常方便,使用完也无需释放,要引用也简 单,但是创建后无法改变其大小是其致命弱点! 例:int a[100]; 动态数组:动态数组是随程序需要而重新指定大小。 动态数组的内存空间是从堆动态分配的,是通过执行 代码而为其分配存储空间。当程序执行到我们编写 的分配语句时,才为其分配。动态数组,其创建麻 烦,使用完必须由程序员自己释放,否则将会引起 内存泄露。但其使用非常灵活,能根据程序需要动 态分配大小。
int main() {
int len; double *array; scanf("%d", &len); array = allocate(len); input(array, len); output(array, len); release(array); }
void output(double* p, int n)
for (col = 0; col < n; col++) {
printf("%d ", array[row*n+col]); printf("\n"); } /*释放空间*/ free(array);
上机作业
(1)上机熟悉动态存储分配的操作
2020年3月16日星期一
2020年3月16日星期一
{ int i,a,b;
#inscclaundfe("<%stdd%iod.h">,&a,&b);
#inicf l(ubd<e=<0s||tad>linb).h>
#voinidclupredrlienat<fs(se"t(rndionoguo.buhlt>ep*utp\n) ");
分配n个数据项的内存连续空间,每个数据项的 大小为size字节 返回值 若成功,返回指向该存储区地址的指针 若失败,返回NULL
calloc函数的使用
2020年3月16日星期一
动态内存分配的一个例子如下:
int *p = NULL; *p = (int *)calloc(75,sizeof(int));
realloc函数
2020年3月16日星期一
函数原型 void *realloc(void *p,unsigned size); 功能
将p所指的已分配内存区的大小改为size字节, size可以比原来分配的空间大或小 返回值 若成功,返回指向新分配内存区的指针(与原来 分配的首地址不一定相同) 若失败,返回NULL
} retfuorrn(ai=; 1;i<=b;i++)
}
printf("%lg\n",*(p+i-1));
else if (a>=1&&b>n)
for (i=a;i<=n;i++)
printf("%lg\n",*(p+i-1));
else if (a<=0&&b>n)
for (i=1;i<=n;i++)
malloc()与calloc()的主要区别 2020年3月16日星期一
函数calloc()会将所分配的内存空间中的每一位都 初始化为零,即:如果是为字符类型或整数类型的 元素分配内存,那么这些元素将保证会被初始化为0; 如果是为指针类型的元素分配内存,那么这些元素 通常会被初始化为空指针;如果你为实型数据分配 内存,则这些元素会被初始化为浮点型的零。 函数malloc()不能初始化所分配的内存空间。
动态内存分配
2020年3月16日星期一
动态内存分配(Dynamic Memory Allocation) 根据需要开辟或释放存储单元
相关函数 malloc函数 calloc函数 free函数 realloc函数
说明 应包含malloc.h或stdlib.h
malloc函数
2020年3月16日星期一
2020年3月16日星期一
动态内存分配的一个例子如下:
int *p = NULL; *p = (int *)malloc(100);
malloc函数返回的是一个void类型的指针,写做 void*。
如果因某种原因而不能分配请求的内存,malloc() 会返回一个空指针(NULL )。最好先用if语句检查 请求动态分配的内存是否已分配,再使用它。
array = (int *)calloc(m*n, sizeof(int));
if (array == 0)
// 内存申请失败,提示退出
{
printf(“内存分配失败!\n");
exit(0);
// 终止程序运行,返回操作系统
}
二维动态数组的实现(方法2)
2020年3月16日星期一
//输出二维数组 for(row = 0; row < m; row++)
函数原型 void *malloc(unsigned int size); 参数
size:要分配的存储空间的大小(字节数) 功能
在内存的动态存储区内分配一段长度为size字 节的连续空间。 返回值 若成功,返回指向该存储区地址的指针(类型 为void) 若失败,返回空指针(NULL)
malloc函数的使用
p[row]=(int *)malloc(n * sizeof(int)); for(col=0;col<n;col++)
p[row][col]=0; }
二维动态数组的实现(方法1)
/*释放空间*/ for (row=0;row<m;row++) {
free(p[row]); } free(p);
二维动态数组的实现(方法1)
2020年3月16日星期一
int **p,m,n,row,col; printf("please input array size m , n:\n"); scanf("%d,%d",&m,&n);
/*申请二维动态数组使用的内存块*/ int **p; p=(int **)malloc(m * sizeof(int *)); for (row=0;row<m;row++) {
a[1][0] a[1][1] a[1][2] a[1][3] a[2]
a[2][0] a[2][1] a[2][2] a[2][3] 每个元素a[i]又是一个包
含4个元素的一维数组2 3
a[1] 4 5 6 7
a[2] 8 9
10 11
a[0][0] a[0][1] a[0][2] a[0][3] a[1][0] a[1][1] a[1][2] a[1][3] a[2][0] a[2][1] a[2][2] a[2][3]
calloc函数返回的是一个void类型的指针,写做 void*。
如果因某种原因而不能分配请求的内存,calloc() 会返回一个空指针(NULL )。最好先用if语句检查 请求动态分配的内存是否已分配,再使用它。
if(p == NULL) {
puts(“存储空间分配失败!”); exit(0); }
d{vooueilbdsleien*ipfau(latl(>odc=oa1ut&eb(l&ien*bt p<n,)=inn)t n)