1.C语言 动态内存分配
1.1 malloc( size_t size)
作用:在堆区申请长度为size的内存空间 ,返回值为这段内存的首地址。
1.1.1 开辟内存,写入整型数组
开辟的堆区空间,当做数组使用,空间是连续的。
free之后的空间,不会立即失效。通常将free后的地址,再次赋值为NULL。
注意:不可以free野指针,程序会崩溃。free的地址必须是Malloc 申请返回的地址.
例:申请长度为10的整型数组。
int *p1=(int*)malloc(sizeof(int)*10);
//写入数据
for(size_t i=0;i<10;i++){
p1[i]=i+10;
}
for(size_t i=0;i<10;i++){
printf("数组是%d\n",p1[i]);
}
free(p1);
p1=NULL;
1.1.2 字符数组 需要自己加终止符
char *p2=(char*)malloc(sizeof(char)*11);
if(p2==NULL){
printf("失败!");
return -1;
}
char str[]="ABCDEFGHIJ";
for(int i=0;i<10;i++){
p2[i]=str[i];
}
p2[10]='\0';
printf("%s",p2);
free(p2);
p2= NULL;
1.2 二维数组使用动态内存
1.2.1 整型数组
int **p3=(int**)malloc(sizeof(int*)*3) ;
for(int i=0;i<3;i++){
p3[i]=(int *)malloc(sizeof(int)*4);
}
//同时写两层数据
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
p3[i][j]=i+j; // 或者: *(*(p+i)+j)=你的赋值
}
}
for(int i=0;i<3;i++){
for(int j=0;j<4;j++){
printf("%d ",p3[i][j]);
}
printf("\n");
}
//释放内层,再外层
for(int i=0;i<3;i++){
free(p3[i]);
}