#动态内存分配和静态内存分配
* 动态 new出来的都是动态的 需要程序员手工的申请,需要手工的释放,运行在堆里面。必须由程序员手工的回收,或者垃圾回收器去回收内存空间。大小可以无限大,整个windows操作系统系统的内存。
* 静态 定义出来的都是静态的 int i; int j; 运行在栈里面,后进先出的结构,方法执行完毕,操作系统会自动的回收内存空间。都是有大小限制。
//malloc memeory allocate 内存申请 realloc re allocate重新分配
#include <stdio.h>
#include <malloc.h> //内存分配的导包 头文件
main()
{
// malloc(需要多少个byte的空间) 堆内存;
//申请内存
int* p ; //栈内存里面申请空间 4个byte
p =(int*)malloc(4); // 堆内存4个byte
printf("p=%#x\n",p);
*p = 333;
printf("*p=%d\n",*p);
p = realloc(p,8);
*(p+1) = 66666;
printf("*(p+1)=%d\n",*(p+1));
//释放内存
free(p);
printf("*p=%d\n",*p);
system("pause");
}
练习代码
//malloc memeory allocate 内存申请 realloc re allocate重新分配
#include <stdio.h>
#include <malloc.h> //内存分配的导包 头文件
/**
arr[] 数组
length 数组的长度
**/
void printArr(int arr[], int length){
int i=0;
for(;i<length;i++){
printf("学生[%d]=%d\n",i,arr[i]);
}
}
main()
{
printf("----------欢迎使用黑马学号管理系统--------\n");
printf("----------************************--------\n");
printf("----------☆☆☆☆☆☆☆☆☆☆☆☆--------\n");
printf("请输入学生的数量:\n");
int studentCount;
scanf("%d",&studentCount);
//申请内存用于存放学号 int数组
//动态分配内存
int* studentNumberArr = (int* )malloc(studentCount*sizeof(int));
printf("请输入学生的学号:\n");
int i =0;
for( ;i<studentCount;i++){
printf("请输入第%d个学生的学号:\n",i);
scanf("%d", studentNumberArr+i);
}
//打印信息,
printf("您输入的学生学号为:\n");
printArr( studentNumberArr, studentCount);
printf("请输入新入学的学生的数量:\n");
int addCount;
scanf("%d",&addCount);
studentNumberArr = (int* )realloc(studentNumberArr,(studentCount+addCount)*sizeof(int));
printf("请输入新入学的学生的学号:\n");
i = studentCount;
for( ;i<(studentCount+addCount);i++){
printf("请输入第%d个学生的学号:\n",i);
scanf("%d", studentNumberArr+i);
}
//打印信息,
printf("您输入的学生学号为:\n");
printArr( studentNumberArr, studentCount+addCount);
free(studentNumberArr);
system("pause");
}
17_内存空间的概念复习
>java代码 new 对象 创建在堆内存里面。
Person p = new Person();
在栈内存创建一个指针变量 存放对象引用(地址)
在堆内存创建一个对象 person
垃圾回收器 会回收没有引用的对象。
>c代码
malloc()
realloc()
free()
>c代码
malloc()
realloc()
free()