2.为什么要使用动态内存
1)按需分配,根据需要分配内存,不浪费
2)可以用来给 “被调用函数之外的函数” 调用 “被调用函数” 内部的指针所指向的内存空间
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//通过返回动态内存的指针
int * demo(int count){
int *ap = NULL;
//new delete C++ 的动态内存分配操作符 c 语言是 malloc
ap = (int *)malloc(sizeof(int) * count);//参数:所需内存的字节数
//ap = new int[count];
for(int i=0; i<count; i++){
ap[i] = 100+i;
}
for(int i=0; i<count; i++){
printf("*(ap+%d) = %d\n", i, *(ap+i));
}
return ap;
}
//通过二级指针来保存
//pointer_p的存储内容是pointer的地址,所以它本身是一个指针,pointer也是一个指针
//所以pointer_p是指向指针的指针,也就是二级指针
void demo1(int count, int ** pointer_p){
int * ap = NULL;
*pointer_p=(int *)malloc(sizeof(int) * count);//给*pointer_p开辟内存空间
ap = *pointer_p;
for(int i=0; i<count; i++){//赋值
ap[i] = 100+i;
}
for(int i=0; i<count; i++){
printf("*(ap+%d) = %d\n", i, *(ap+i));
}
}
int main(void){
//两种方式获取被调用函数内部的内存
int * pointer = NULL;
int count = 10;
//第一种,通过返回动态内存的指针
//pointer = demo(count);
//第二种,通过二级指针来保存
demo1(count, &pointer);//传入pointer指针的地址
for(int i=0; i<10; i++){
printf("*(pointer+%d) = %d\n", i, *(pointer+i));
}
//用完了,要记得释放
free(pointer); //c 语言中的释放内存函数,相当于 delete
system("pause");
return 0;
}
malloc
在内存的动态存储区中分配一块长度为
size
字节的连续区域,并且返回该区域的首地址
3) 可以突破栈区的限制,给程序分配比栈区能提供的更大的内存空间
栈区的空间大小是有限制的,windows 上一般是 1M - 2M,如果使用堆的话,64 位 windows 10 系统的限制是 2G