C 语言内存管理

//
//  main.m

#import <Foundation/Foundation.h>

int a =100;
//void test(){
//    int a =8;
//
//}
//当函数调用的时候test2当中的变量c d会打印test1中a,b的值,是因为当我们函数test1运行结束之后会释放a,b的标记(地址),但是a b的值依然存在,所以当我们类型相同的函数和其内部变量定义出来之后(没有初值),我们还会使用的是相同的内存里边的相同的值所以切记要去"赋初值";

//
//void test1(int a,int b){
//
//
//    printf("a=%d,b=%d\n",a,b);
//    printf("%p,%p ",&a,&b);
//}
//
//void test2(){
//
//    int c,d;
//    printf("c=%d,d=%d\n",c,d);
//    printf("%p,%p ",&c,&d);
//
//
//}

int main(int argc, const char * argv[]) {

//    test1(4,5);
//
//    test2();
//
    //从大到小

    //栈区

//    int a=5;
//    printf("栈区=%p\n",&a);
//
//
//
//    //堆区
//    NSObject *abj=[NSObject new];
////    NSString *string =[NSString alloc init];
//    printf("堆区:%p\n",abj);
//
//
//
//    //静态区
//    static int b=6;
//    printf("静态区:%p\n",&b);
//
//
//
//    //常量区
//    char *p="iphone";
//    printf("常量区 :%p\n",p);
//    //代码区
//
//    printf("代码区:%p\n",&test);
//    

//    //const 可以把我们的变量改为常量
//
//   const int c=6;
//    c=9; //这样写是错误的,因为这里的c被const修饰之后成为一个常量,不可以被改变

#pragma mark----栈区---
    /*

     分配规则:有系统自行分配,由高到低,

     存储方式: 由低到高
     栈区: 一般存储的是我们定义的一些变量是先进后出,后进先出
     ()

     */

//    int *p=NULL;//首先我们定义的指针 一定是在栈区,因为这里定义的是一个 int * 类型的指针变量
//    printf("p=%p\n",p);
//
//
//    char *p1="iphone";//我们这里的p1是指向的是常量区的字符串,因为我们栈区的指针指向了常量区的字符串"iphone:,而常量区的 ‘iphone‘把地址给了指针p1所以现在p1存储的是我们常量去的地址
//    printf("p1=%p\n",p1);
//
#pragma mark --堆区--

    /*
     堆区:是唯一一个由我们高贵的程序员自行管理  开辟释放的空间
     我们一般做一些操作主要是在堆区上进行,
     例如,c语言当中的malloc oc语言中的new alloc等

     */

//    int *a=malloc(4);//向系统申请了4个字节大小的空间
//    int *b =malloc(sizeof(int)*4);//向系统申请了4个int 类型的大小的空间(也就是16个字节)
//
    //堆内存分配函数:
    //void *malloc(size_t);

    //void *也叫空指针,可以返回任意类型
//    char *arr=malloc(sizeof(char)*8);//向系统申请8个char类型的大小的空间
//    strcpy(arr, "iphone");//将"iphone"拷贝到arr中
//    printf("%s\n",arr);
//
//    strcpy(arr, "Android");
//    printf("%s\n",arr);
//
//    strcpy(arr, "I want you");//不推荐 这样去写,因为后边的几个字节的空间不知道是占用了谁的空间
//    printf("%s\n",arr);
//    free(arr);
//    arr=NULL;

//    int *a=malloc(sizeof(int)*4);
//    free(a);
//    a=NULL;
//
//
//
//    //申请8个short类型的大小的空间
//
//    short *b=malloc(sizeof(short)*8);
//    free(b);
//    b=NULL;
//    //free是标记释放,但是里面的值依然存在
//
    //free(b);过度释放
//    //定义一个由10个元素的数组
//    int arr[10]={1,2,3,4,5,6,7,8,9,10};
//    //开辟空间
//    int *p = malloc(sizeof(int)*10);
//    //将数组元素放入到我们开辟的空间中
//    *p=arr[0];
//    *(p+1)=arr[1];
//    *(p+2)=arr[2];
//    free(p);
//    p=NULL;
//
//    //定义一个结构体
//    typedef struct student{
//        char name[20];
//        int age;
//
//    }stu;
//    //开辟一个结构体大小的空间
//
//    stu *s=malloc(sizeof(stu));

    //有一个字符串 其中包含数字,提取其中的数字,要求动态分配内存保存

    //思路,先计算数字的个数,然后根据数字的个数进行开辟空间
//    char arr[]="1a2b3c4d";
//
//    int i=0;
//    //定义一个变量来记录数字的个数
//    int count=0;
//
//    //定义一个字符串数组 接收我们的数字
//    char str[100]={0};
//
//    //然后遍历arr
//    while (arr[i]!=‘\0‘) {
//        //进行判断
//        if (arr[i]>=‘0‘&&arr[i]<=‘9‘) {
//            str[count]=arr[i];
//            count++;
//
//        }
//        i++;
//    }
//    //手动开辟空间
//    char *p=malloc(sizeof(char)*count+1);
//
//
//    //将我们的数字数组进行拷贝
//    strcpy(p, str);
//
//
//    printf("%s\n",p);
//
//    free(p);
//    p=NULL;

    //输入三个单词,动态分配内存保存单词,并在最后输出

#pragma mark --其他内存分配函数--

    //其他内存分配函数
    /**

     calloc
     void *calloc(size_t(n),size_t(size));
     calloc分配n个size大小的空间,并对其内容进行一个清0
     的操作.calloc相比malloc来说效率会低一些

     realloc
     void *realloc(void *,size_t);
     //根据给定的地址以及给定的大小从新分配,可以清0.但是会带来效率的耗损,

    1,如果开辟空间比原来的空间小, 那么在原来空间的基础上进行开辟(开辟的空间要比原来空间小)

     2.如果开辟的空间比原来空间大的话,那么他会自动开辟一块空间

     不需要我们自己手动释放空间 系统会自动释放
     **/

    //在堆区开辟10个存储空间
//    //malloc
//    char *p=malloc(sizeof(char)*10);
//    strcpy(p,"bobo");
//    printf("%s\n",p);
//    free(p);
//    p=NULL;
//
//    char *str=NULL;//栈区
//
//    str=calloc(10, sizeof(char));
//    //开辟空间并进行清零的操作
//    strcpy(str, "iphone");
//    printf("%s\n",str);
//    

//    int *p_old=malloc(8);
//    int *p_new=realloc(p_old,20);
//    printf("p_old=%p p_new=%p\n",p_old,p_new);
//
//    free(p_old);
//    p_old=NULL;
    //free(p_new);//系统会自动释放,这里的释放属于过度释放

  #pragma mark --内存操作函数--
    /***内存操作函数
     初始化内存
     从给定的地址开始初始化n个字节,初始化的内容为c
     memset(void*s,int c,size_t n);

     内存拷贝

     /从source指向的内存开始拷贝到dest,拷贝n个字节
     memcpy(void *dest, void source, size_t  n);

     内存比较
     比较buf1和buf2,比较n个字节
     memcmp(const void *buf1, const void *buf2, size_t n);
     **/

    //初始化内存
//    int *array=malloc(12);
//    for (int i=0; i<12; i++) {
//        array[i]=arc4random()%(10-1+1)+1;
//        printf("%d ",array[i]);
//    }printf("\n");
//
//    memset(array, 0, 12);//首先我们int类型占4个字节,然而我们这里是初始化了12 个字节,所以我们控制台会有3个整型被初始化.
//    for (int i=0; i<12; i++) {
//        printf("%d ",array[i]);
//    }printf("\n");
//
//
//
//    char *ch=malloc(10);//申请10个字节大小的空间
//    memset(ch, ‘b‘, 10);//
//    for (int i=0; i<10; i++) {
//        printf("%c ",ch[i]);
//    }printf("\n");
//
//
    //两种遍历方式:
    //while(){}
    //for 循环
    //for in oc当中快速枚举

    //内存拷贝
//
//    char name[]= "supermen";
//    char num[]= "007";
//    memcpy(name+2 , num, 3);
//    printf("%s\n",name);

    //内存比较
    //
//    char name1[]="aeftsdfdsf";
//    char name2[]="abdesdvsdf";
//  int name=memcmp(name1, name2, 2);
//    printf("%d\n",name);

    //定义两个整型指针,分别用malloc  calloc对其分配空间3个元素,malloc分配空间用calloc进行清零操作,随机对数组 进行赋值,,随机范围1-3;使用memcmp比较两个数组,如果相同打印good!不同打印faied...
//
//    int *a=malloc(12);
//    int *b=calloc(3,4);
//
//    memset(a, 0, 12);
//
//    for (int i=0; i<3; i++) {
//
//       a[i]=arc4random()%(10-1+1)+1;
//        printf("%d ",a[i]);
//
//    }printf("\n");
//    for (int i=0; i<3; i++) {
//
//        b[i]=arc4random()%(10-1+1)+1;
//        printf("%d ",b[i]);
//    }
//
//    printf("\n");
//
//    int c=memcmp(a, b, 12);
//
//    if (c==0) {
//        printf("good!!");
//
//    }else{
//        printf("faied!!");
//    }
//    

#pragma mark--静态区:全局变量 局部变量--

//    static  int a =8;
//    a=9;
//
//    printf("%d\n",a);
//
//
    /*
     静态去:一般存储的是我们的一些全局和局部的变量
     static修饰:在程序运行的周期当中值初始化一次

     静态区内的东西 直到程序运行结束 才会被释放,在这个当中它伴你久久;
     1.只初始化一次
     2.如果没有初始化,默认为0;
     3.只有程序退出才释放

     */

#pragma mark--常量区--

    /*

     常量区,一般存储的是字符串,数字,字符串等常量,这里边的东西都是readonly(只读),我们只是可以看但是不可以修改,一旦修改程序混崩溃

     */
//    char *p="iphone";
////    *(p+1)=‘w‘;
//    printf("%c",*(p+1));不可以去修改.

#pragma mark--代码区--

    //函数存储在哪个区?
    /*

     我们编写的程序,运行程序之后,最终都会转换成二进制的形式存储在代码区中

     **/

    //练习:在堆区开辟空间,存储10个整数
//    int *a=malloc(sizeof(int)*10);
//    a=NULL;
//
//    //在堆区开辟空间,存储5个短整型数,为每个元素随机赋值[20,30],并对数组进行升序排序
//   short *b=malloc(5);
//    for (int i=0; i<5; i++) {
//        b[i]=arc4random()%(30-20+1)+20;
//        printf("%d ",b[i]);
//    }printf("\n");
//        for (int i=0; i<4; i++) {
//            for (int j =0; j<4-i; j++) {
//                if (b[j]>b[j+1]) {
//                    short temp=b[j];
//                    b[j]=b[j+1];
//                    b[j+1]=temp;
//                }
//            }
//        }for (int i=0; i<5; i++) {
//            printf("%d ",b[i]);
//        }printf("\n");
//
//
//
//
//    //有一个已知的整形数组,赋值随机[20,40]将大于30的数字存储到堆区空间上,在堆区动态开辟空间
//
//    int c[10]={0};
//    int count=0;
//    for (int i=0; i<10; i++) {
//        c[i]=arc4random()%(40-20+1)+20;
//        printf("%d ",c[i]);
//        if (c[i]>30) {
//            count++;
//        }
//    }
//    int *d=malloc(sizeof(int)*count);
//
//    for (int i=0,j=0; i<10; i++) {
//        if (c[i]>30) {
//            *(d+j)=c[i];
//            j++;
//        }
//    }
//    printf("\n");
//    for (int i=0; i<count; i++) {
//        printf("%d ",*(d+i));
//    }
//    printf("\n");

    //由一已知字符串,其中包含数字,字符,提取其中数字符,动态分配内存保存
////
//    char arr[]="1h2g3g4h5g";
//    int i=0;
//    int count1=0;
//    while (arr[i]!=‘\0‘) {
//        if (arr[i]>=‘0‘&&arr[i]<=‘9‘) {
//                count1++;
//    }
//                    i++;
//
//    }
//
//    char *p1=malloc(sizeof(char)*count1+1);
//    for (int i=0,j=0; i<9; i++) {
//        if (arr[i]>=‘0‘&&arr[i]<=‘9‘) {
//            *(p1+j)=arr[i];
//            j++;
//        }
//    }for (int i=0; i<count1; i++) {
//        printf("%c",*(p1+i));
//    }printf("\n");
//
//    //在堆区为3个整数开辟空间,存储10,20,30;
//
//    int *q=malloc(sizeof(int)*3);
//    for (int i=0; i<3; i++) {
//        *q=(i+1)*10;
//
//        printf("%d ",*q);
//    }
//
//    

//
//    int array[3] = {1,4};
//    for(int i = 0;i < 3;i++)
//    { printf("%d",array[i]); }

//    int x=10,y=10,i;
//    for(i=0;x>8;y=++i){
//        printf("%d %d ",x--,y);
//}

    return 0;
}
时间: 2024-10-05 01:50:23

C 语言内存管理的相关文章

iOSDay08之C语言内存管理

本次主要学习和理解C语言中的内存管理 1.存储区划分 按照地址从高到低的顺序:栈区,堆区,静态区,常量区,代码区 1> 栈区:局部变量的存储区域 局部变量基本都在函数.循环.分支中定义 栈区的内存空间由系统自动分配和回收 栈顶,栈底:先定义的局部变量存储区域从栈底开始分配,后定义的局部变量向栈顶分配 特点:先进后出,后进先出 当函数.循环.分支结束后,局部变量的生命周期结束,不能被使用,由系统自动回收内存空间 1 void test1() { 2 int a = 100; 3 } 4 5 voi

iOS核心语言Objective C语言 —— 内存管理

本分享是面向有意向从事iOS开发的伙伴以及苹果产品的发烧友们,或者已经从事了iOS的开发者,想进一步提升者.如果您对iOS开发有极高的兴趣,可以与我一起探讨iOS开发,一起学习,共同进步.如果您是零基础,建议您先翻阅我之前分享的iOS开发分分钟搞定C语言系列,然后在开始Objective C语言的学习,如果您遇到问题也可以与我探讨,另外将无偿分享自己整理出来的大概400G iOS学习视频及学习资料,都是干货哦!可以新浪微博私信?关注极客James,期待与您的共同学习和探讨!!由于时间有限,每天在

Objective-C语言-内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

OC语言--内存管理

1.内存管理原理的介绍 1.1C的内存管理 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. strcpy(p,"Hello World!"); 将字符串拷贝给指针变量p指向的内存空间. puts(p); 将p指针指向的内存空间里的字符串打印出来. free(p); 使用完成后,手动跟系统释放内存空间:或

浅谈C语言内存管理、内存泄露、堆栈

1.内存分配区间: 对于一个C语言程序而言,内存空间主要由五个部分组成:代码段(.text).数据段(.data).静态区(.BSS).堆和栈组成. BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量和静态变量 (这里注意一个问题:一般的书上都会说全局变量和静态变量是会自动初始化的,那么哪来的未初始化的变量呢?变量的初始化可以分为显示初始化和隐式初始化,全局变量和静态变量如果程序员自己不初始化的话的确也会被初始化,那就是不管什么类型都初始化为0,这种没有显示初始

C语言内存管理

作用域: 1.代码块儿作用域: 注意的是:这里面{}就代表一个代码块儿,里面的东西是独立的,不可被其他地方访问的. 2.函数作用域 3.文件作用域 先提一下 在当前有一个文件,main.c 还有一个文件比如叫做a.c 这个东西就属于文件作用域了,左边有一个变量叫做mainiii=0 在a.c里面有一个变量叫做aiii = 3.两个变量分属不同的文件,他们拥有各自的文件作用域,不能混用. 4.Auto:自动变量 一般不写就认为是auto类型的.我们通常定义的变量都属于 auto,他们都存放在 内存

【转】C语言知识整理(3):内存管理(详细版)

原文链接:http://www.cnblogs.com/yif1991/p/5049638.html 在计算机系统,特别是嵌入式系统中,内存资源是非常有限的.尤其对于移动端开发者来说,硬件资源的限制使得其在程序设计中首要考虑的问题就是如何有效地管理内存资源.本文是作者在学习C语言内存管理的过程中做的一个总结,如有不妥之处,望读者不吝指正. 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量:不

Objective-C内存管理

1.内存管理中的基本问题 1.1为什么要进行内存管理    分配在堆空间中的对象 需要手动去释放 回顾堆栈的区别                                                                          生命周期 栈空间    函数 函数中局部变量             调用函数压栈    函数调用结束 释放 数据段    静态变量  全局变量                程序开始             程序结束 释放 堆:     

OC基础 内存管理

OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free(p); c语言内存管理存在的缺陷: (1)不释放就会造成内存泄露. (2)多次释放就会造成崩溃. (3)大型项目中多人对一块内存进行操作时,不能释放内存,因为不知道别人是否还在使用. oc语言的内存管理 1.内存管理 (1)引用计数. (2)内存管理的黄金法则:谁创建谁释放. 让我们来看一下测试例