用malloc分配数组 假设需要一个n元素的数组,n在运行时由用户输入 分配方法: int *a; a malloc(n sizeof(int)); 尽量使用sizeofi运算符去确定分配空间的大小 之后可以忽略a是一个指针的事实,可以将a当作数组 使用,这得益于C中数组和指针的紧密关系 可用下列循环对数组清零: for (i=0;i<n;i++) a[i]=0; ■也可以对a施以指针算术运算 16
假设需要一个n元素的数组,n在运行时由用户输入 分配方法: 尽量使用sizeof运算符去确定分配空间的大小 之后可以忽略a是一个指针的事实,可以将a当作数组 使用,这得益于C中数组和指针的紧密关系 可用下列循环对数组清零: 也可以对a施以指针算术运算 用malloc分配数组 16 int *a; a = malloc(n * sizeof(int)); for (i = 0; i < n; i++) a[i] = 0;
calloci函数 ■calloc函数是malloc,之外的另一个选择 ■calloc的原型: void *calloc(size t nmemb,size t size); ■ calloc的特性: 冬语义:分配具有nmemb个元素的空间,每个元素大小为 size bytes 如果不能成功分配,返回空指针 calloc会将分配的空间用0初始化 分配n个整数的空间:a=calloc(n,sizeof(int); 分配任意类型的数据结构: struct point int x,y;*p; p calloc(1,sizeof(struct point)); 17
calloc函数 calloc函数是malloc之外的另一个选择 calloc的原型: void *calloc(size_t nmemb, size_t size); calloc的特性: 语义:分配具有nmemb个元素的空间,每个元素大小为 size bytes 如果不能成功分配,返回空指针 calloc会将分配的空间用0初始化 分配n个整数的空间: a = calloc(n, sizeof(int)); 分配任意类型的数据结构: struct point { int x, y; } *p; p = calloc(1, sizeof(struct point)); 17
realloc函数 realloc函数可以调整已动态分配空间的数组的尺寸 realloc的原型: void *realloc(void *ptr,size t size); ptr为指向原来由malloc,,calloc和realloc返回的指向内 存块的指针;size代表希望的新的尺寸,可能比原有 的大,也可能小 18
realloc函数 realloc函数可以调整已动态分配空间的数组的尺寸 realloc的原型: void *realloc(void *ptr, size_t size); ptr为指向原来由malloc, calloc和realloc返回的指向内 存块的指针;size代表希望的新的尺寸,可能比原有 的大,也可能小 18
realloc的特性 在对内存块进行扩张时,新加入的空间realloc不会初 始化 如果不能扩张内存块的大小,realloci返回空指针,原 有内存块中的数据不变 如果realloc的第一个参数为空指针,则与malloc的功 能相同 如果realloc第二个参数为0,会释放指定的内存空间 如果不能原地扩张内存块,realloc会申请一块新的空 间,然后把老空间的内容拷贝过去 ■realloci调用结束后,记得更新所有指向原内存块地址 的指针 19
realloc的特性 在对内存块进行扩张时,新加入的空间realloc不会初 始化 如果不能扩张内存块的大小,realloc返回空指针,原 有内存块中的数据不变 如果realloc的第一个参数为空指针,则与malloc的功 能相同 如果realloc第二个参数为0,会释放指定的内存空间 如果不能原地扩张内存块,realloc会申请一块新的空 间,然后把老空间的内容拷贝过去 realloc调用结束后,记得更新所有指向原内存块地址 的指针 19
释放存储空间 ■malloci和其它几个内存分配函数都是从称为堆 (heap)的内存区域中分配空间 如果调用动态内存分配函数过于频繁,分配了 过多的内存空间,堆空间可能耗尽,导致接下 来的内存分配失败 更糟的是,程序有可能存在bug,分配空间后 又丢失了对所分配空间的控制,导致内存泄漏 20
释放存储空间 malloc和其它几个内存分配函数都是从称为堆 (heap)的内存区域中分配空间 如果调用动态内存分配函数过于频繁,分配了 过多的内存空间,堆空间可能耗尽,导致接下 来的内存分配失败 更糟的是,程序有可能存在bug,分配空间后 又丢失了对所分配空间的控制,导致内存泄漏 20