//内存的5个区域
//1 栈区 --由系统分配和回收内存(释放内存,先进后出)。函数体内创建的变量分配在栈区
int a=10; //a存在内存的栈区。
//2 堆区(重点讲解)
//由用户(程序员)分配和回收,如果程序员未回收内存,那么内存就会越用越少,有可能导致内存不够用,程序崩溃。如果没有达到不够用,程序安然无恙。当程序退出时,堆内存有系统回收。
//3 常量区
//10存放在常量区,程序结束后释放内存
//4 静态区(全局区)
//定义在函数体外的变量,由系统开辟空间,程序运行过程中一直存在,直到程序退出由系统回收。
//5 代码区
//函数通常编译成二进制代码存放的区域
//1 栈区 --由系统分配和回收内存(释放内存,先进后出)。函数体内创建的变量分配在栈区
int a=10; //a存在内存的栈区。
//2 堆区(重点讲解)
//由用户(程序员)分配和回收,如果程序员未回收内存,那么内存就会越用越少,有可能导致内存不够用,程序崩溃。如果没有达到不够用,程序安然无恙。当程序退出时,堆内存有系统回收。
//3 常量区
//10存放在常量区,程序结束后释放内存
//4 静态区(全局区)
//定义在函数体外的变量,由系统开辟空间,程序运行过程中一直存在,直到程序退出由系统回收。
//5 代码区
//函数通常编译成二进制代码存放的区域
#import <Foundation/Foundation.h>
typedef struct stu{
char name[20];
char sex;
int age;
}Student;
int main(int argc, const char * argv[]) {
/*
//内存的5个区域
//1 栈区 --由系统分配和回收内存(释放内存,先进后出)。函数体内创建的变量分配在栈区
int a=10; //a存在内存的栈区。
//2 堆区(重点讲解)
//由用户(程序员)分配和回收,如果程序员未回收内存,那么内存就会越用越少,有可能导致内存不够用,程序崩溃。如果没有达到不够用,程序安然无恙。当程序退出时,堆内存有系统回收。
//3 常量区
//10存放在常量区,程序结束后释放内存
//4 静态区(全局区)
//定义在函数体外的变量,由系统开辟空间,程序运行过程中一直存在,直到程序退出由系统回收。
//5 代码区
//函数通常编译成二进制代码存放的区域
*/
//第20讲动态内存分配
//malloc() calloc() realloc() 三个函数(仅在堆空间)都要和free()一起使用。否则内存很快就耗完了。
//malloc()使用1
/*
char *str=malloc(8);
// malloc 分配指定大小的内存空间,但是不会把分配的空间清零
strcat(str,"iphone");
printf("%s\n",str);
free(str);
// 标记删除,但并不会清零
*/
/*
//malloc()使用1 分配一位数组空间
int *arr = malloc(sizeof(int)*5);//指针和数组有时可以互用
arr[0]=15;
arr[1]=8;
arr[3]=9;
arr[4]=10;
for(int i=0;i<5;i++){
printf("%d\n",arr[i]);
}
//怎么样就把一个指针当数组用了,去*加方括号
//malloc()使用2 分配两行三列的数组
int (*q)[3]=malloc(sizeof(int)*2*3);
q[0][0]=1;
q[0][1]=9;
q[0][2]=3;
q[1][0]=5;
//字符串数组 分配字符串数组
char (*p)[255]=malloc(5*255); //定义5个长度为255字符型的字符串
strcpy(p[0], "iphone");
printf("%s\n",p[0]);
*/
/*
//结构体指针定义
Student *p=malloc(sizeof(Student));
strcpy(p->name,"zhangsan");
printf("%s\n",p->name);
free(p);
//结构体数组定义
Student *q=malloc(sizeof(Student)*5);
strcpy(q[0].name, "李四");
printf("%s\n",q[0].name);
free(q);
*/
//calloc()的使用
int *t1 = calloc(10,4);//分配40个字节(连续),10个4字节,对分配内存清零,常配合结构体一起使用。
int *t2 = calloc(5,sizeof(Student));
//realloc()重新分配更大的空间,如果原来的空间够用则不用,如果原来的空间不够用,则把原来的内容复制到新分配的空间来继续。
//memset() 堆栈都可操作
memset(t2, 0, sizeof(Student));
void *t3 = malloc(100);//给t3指针分配一个100字节的空间
memset(t3+10, 1, 20);//从t3首地址+10字节点位置开始,连续的20个字节赋值为1
//memcopy()
Student *t4=malloc(sizeof(Student));
Student *t5=malloc(sizeof(Student));
strcpy(t4->name, "wangwu");
memcpy(t5, t4, sizeof(Student));
printf("%s\n",t5->name);
malloc(<#size_t#>)
calloc(<#size_t#>, <#size_t#>)
realloc(<#void *#>, <#size_t#>)
memset(<#void *#>, <#int#>, <#size_t#>)
memcpy(<#void *#>, <#const void *#>, <#size_t#>)
return 0;
}