内存分配
Stack OverFlow错误
,系统自动分配、释放。这些都是我们自己做的逻辑分区,物理层面上是不存在分区的。
//栈内存
void stackFun(){
//栈内存自动释放内存
int i[1024];
}
//堆内存 单位是字节1024字节为1kb,1024kb是1M
void heapFun(){
//分配4M内存 malloc的返回值为void* 所以返回值类型为任意类型指针。
int *a = malloc(1024 * 1024 * sizeof(int));
//释放内存
free(a)
}
静态内存分配
和动态内存分配
//尖括号代表系统类库,std表示标准,io表示输入输出 引入标准输入输出
#include<stdio.h>
//lib表示类库 引入标准类库
#include<stdlib.h>
void main(){
//静态内存分配创建数组,数组的大小是固定的
int z = 20;
int a[z];
int len;
printf("请输入数组的长度:");
//创建一个数组,动态指定数组的大小(在程序运行规程中,可以随意的开辟指定大小的内存,以供使用,相当于JAVA中的集合)
scanf("%d",&len);
//动态开辟内存大小为len*4,p是数组的首地址也是数组的名称
int * p = malloc(len * sizeof(int));
//用刚开辟的内存区域给数组元素赋值
int i = 0;
for(; i < len; i++){
p[i] = rand() % 100;
printf("%d,%#x\n",p[i],&p[i]);
}
//手动释放内存
free(p);
getchar();
}
(动态内存分配)
realloc
: realloc(原来内存的指针,内存扩大之后的总大小); //尖括号代表系统类库,std表示标准,io表示输入输出 引入标准输入输出
#include<stdio.h>
//lib表示类库 引入标准类库
#include<stdlib.h>
void main(){
//静态内存分配创建数组,数组的大小是固定的
int z = 20;
int a[z];
int len;
printf("请输入数组的长度:");
//创建一个数组,动态指定数组的大小(在程序运行规程中,可以随意的开辟指定大小的内存,以供使用,相当于JAVA中的集合)
scanf("%d",&len);
//动态开辟内存大小为len*4,p是数组的首地址也是数组的名称
int * p = malloc(len * sizeof(int));
//用刚开辟的内存区域给数组元素赋值
int i = 0;
for(; i < len; i++){
p[i] = rand() % 100;
printf("%d,%#x\n",p[i],&p[i]);
}
int addLen;
printf("输入数组增加的长度:");
scanf("%d",&addLen);
//扩大刚分配的空间
//realloc(原来内存的指针,内存扩大之后的总大小)
int * p2 = realloc(p,sizeof(int)*(len+addLen));
if(p2 == NULL){
printf("空间不足,申请失败");
}
//重新赋值
i = 0;
for(;i < len + addLen; i++){
p2[i] = rand() % 100;
}
//手动释放内存
if(p! = NULL){
free(p2);
p = NULL;
}
if(p2 != NULL){
free(p2);
p2 = NULL;
}
getchar();
}