6.动态内存分配:一般按照可以容纳可能出现的最多元素来做
优点:简单
缺点:声明中引用了限制,如果程序需要使用的元素超过声明的长度:
7.常用动态分配内存分配函数:
C语言中提供了3个动态内存分配函数:
1)malloc 函数
格式: void * malloc(unsigned size);
从内存的堆区分配大小为size个字节的连续的内存空间
如果内存分配成功 返回内存的首地址
失败 NULL
#include <stdio.h>
#include <stdlib.h>
/**
* malloc函数的使用
*/
void test1(){
//从内存中申请一块内存空间,可以存储4个整数
// = 赋值,要求等号的左右两侧的类型要一致
//p中存放的事新申请的内存空间的首地址
//注意:malloc 申请的内存空间,如果我们不赋值?
// 是垃圾数
int *p = (int*)malloc(4*sizeof(int)); //16个字节
//使用一个函数给malloc申请的空间进行初始化
memset(p,'a',16);
if (p!=NULL) {
//申请成功做的事情
// *p = 10;
// *(p+1) = 100;
// *(p+2) = 1000;
// *(p+3) = 10000; //存放4个整数
}else{
//内存申请失败
printf("内存申请失败!\n");
}
for(int i=0;i<4 ;i++){
printf("%c\t",*(p+i));
}
}
void test2(){
//calloc 分配指定块数和长度的内存空间
//格式:calloc(块数,长度)
//分配了4块,每一块内存长度为4的内存空间
//他们的地址也是连续的
//注意事项:
//calloc 它使可以帮我们自动的初始化为0
int *p = (int *)calloc(4,sizeof(int)); //16个字节
if (p!=NULL) {
//申请成功做的事情
*p = 10;
*(p+1) = 100;
*(p+2) = 1000;
*(p+3) = 10000; //存放4个整数
}else{
//内存申请失败
printf("内存申请失败!\n");
}
for(int i=0;i<4 ;i++){
printf("%d\t",*(p+i));
}
}
int main(int argc, const char * argv[]) {
int *p = (int*)malloc(4*sizeof(int)); //16个字节
printf("old %p\n",p);
//realloc 函数可以给已经存在的空间扩充大小
p = realloc(p, 40*sizeof(int));
printf("new %p\n",p);
//40个内存空间
if (p!=NULL) {
//申请成功做的事情
*p = 10;
*(p+1) = 100;
*(p+2) = 1000;
*(p+3) = 10000; //存放4个整数
*(p+39)= 1;
printf("%d\n",*(p+39));
}else{
//内存申请失败
printf("内存申请失败!\n");
}
for(int i=0;i<4 ;i++){
printf("%d\t",*(p+i));
}
return 0;
}
|