C语言 内存的五个区域

//内存的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;
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值