静态内存开辟
void staticlloc(){
int arr[int(1024*1024*0.2)];//开8m
int i = 0;
for (; i < 5; i++){
arr[i] = i;
printf("%d %p\n", *(arr + i), arr + i);
}
}
//内存开辟
void main(){
//Stack overflow栈溢出
//int arr[10*1024*1024] ;//10M ,int占4字节,一共40M
//栈:占用内存空间最大值:2M 开辟的方式是静态内存开辟,int arr{10*1024*1024}方法结束后自动回收
//堆:占用内存空间最大值 80% 开辟的方式是动态内存开辟 不会自动回收必须手动回收
while (true){
Sleep(100);
staticlloc();
}
getchar();
}
动态开辟内存(malloc,free)
//动态开辟内存
void main(){
int* arr=(int*)malloc(10 * 1024 * 1024 * sizeof(int));//40M
//释放
free(arr);
getchar();
}
realloc和动态内存开启注意事项
realloc.png
//改变内存空间大小
void main(){
int num;
printf("请输入数的个数");
//获取用户输入的值
scanf_s("%d", &num);
int* arr = (int*)malloc(sizeof(int)*num);
int i = 0;
for (; i < 5; i++){
arr[i] = i;
}
printf("开辟内存的指针:%p\n", arr);
printf("请输入新增的个数");
//realloc改变内存空间大小
int new_num;
scanf_s("%d", &new_num);
//原来那块的内存的值 ,总的大小(原来的大小+新的大小)
int *new_arr = (int *)realloc(arr, sizeof((int)(num + new_num)));
if (new_arr){//若不为空 相当于if(new_arr!=NULL)
i = new_num;//原来的内存可以不用赋值
for (; i < num + new_num; i++){
arr[i] = i;
}
printf("新开辟内存的指针:%p\n", new_arr);
//打印数组
for (; i < num + new_num; i++){
printf("%d,%p/n", *(arr + i), arr + i);
}
}
if (new_arr){
//释放内存,因为新增指针和之前指针是一样的
free(new_arr);
new_arr = NULL;
}
else{
//如果没有成功释放原本的
free(arr);
}
//不要反复去释放,那块地址一旦释放,就有可能被新的应用占用,不要再次释放
//free();
getchar();
//结束后暂停
system("pause");
}
网友评论