码迷,mamicode.com
首页 > 其他好文 > 详细

动态内存分配

时间:2015-07-13 22:10:17      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:

//  main.m

//  C10_动态内存分配

//

//  Created by dllo on 15/7/13.

//  Copyright (c) 2015年 cml. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

//

//void func (){

//    int x =5;

//    int y = 6;

//    printf("x = %p\n",&x);

//    printf("y = %p\n",&y);

//    

//}

//

//

//char * fun(){

//    // 是把一个常量字符串地址返回,但是如果返回一个数组的地址,在函数调用最后会回收栈的内容,返回不了结果,造成错误

//    

//    char *str = "iPhone";// 常量字符串,不可以放数组char stu[]="iPhone"

//    return str;

//}

//

//// 定义一个全局变量

//int global =10;

//

//// 测试静态变量只会初始化一次

//void test(){

//    static int test =10;

//    test +=2;

//    printf("%d\n",test);

//}

 

 

 

 

 

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

    

//    // 五大区所对应的地址

//    // 1.栈区

//    int a =10;

//    int b =6;

//    printf("展区的地址%p\n",&a);

////    printf("%p\n",&b);

////    func();

//

////    char *p =fun();

////    printf("%s\n",p);

//    

////    printf("栈区的地址%p\n",&a );

//    // 栈空间一般会放变量,c语言的数组等数据

//    // 栈空间系统自己管理,开辟还是回收内存都有系统来做

//    // 栈底对应的是内存的高地址,站顶对应低地址,栈里的变量先进后出

//    

//    // 2.堆区

//    // 堆区只能使用匿名访问

//    int * p =malloc(40);

//    printf("堆空间地址%p\n",p );

//    // 这块内存:手动开辟,手动回收

//    

//    // 3.全局静态区

//    // 静态的变量

//    static int c =10;

//    printf("全局静态区地址:%p\n",&c);

////    printf("%p\n",&global);

//    // 全局静态区特点

//    // (1).如果没有初始值,默认为零

//    // (2).周期从程序开始一直到程序结束才会消失

//    // (3).他只会被初始化一次

//    

////    test();

////    test();

////    test();

//

//    // 4.常量区

////    int d =10;

////    if (100 == d) {

////

////    }

////    for ( int  i =0 ;100 ==i; i++) {

////        printf("%d\n",i);

////    }

//

//    // 常量在执行过程中不能发生变化,不能对常量进行赋值

//    char *p2 ="iPhone";

//    printf("常量区地址%p\n",p2);

//

//    // 5.代码区

//    printf("代码区的地址:%p\n",test);

    

    

    //动态分配堆区的空间

    

    // void *malloc(int size)

    // 参数指的是所要申请的空间字节大小

    // void *指的是无类型的指针,需要他是什么类型,只需要用相应的类型指针接收即可转换成相应类型

    // 返回的是堆空间的内存首地址

//    int *p =malloc(40);

//    p[0] = 10;

//    *(p+1) =10;

//    printf("%d\n",p[0]);

//    printf("%d\n",p[1]);

//    printf("%p\n",&p[0]);

//    printf("%p\n",p);

//    

//    int arr[5] = {0};

//    arr[0] = 10;

//    //堆空间使用第一件事先开辟内存

//   

//    // 对堆空间进行随机数赋值,范围是30 -70

//    

//    for (int i =0; i <10; i++) {

//        p[i] = arc4random()%(41)+30;

//    }

//    for (int i =0; i<10; i++) {

//        printf("%d\n",p[i]);

//    }

    

    

//    int *p =malloc(10 * sizeof(int ));

    

    

     // 开辟10个字节空间

    

    // 然后char*指针来接受

    

    // 对这块内存进行赋值,赋值内容"iPhone"

    

//    char *p =malloc(10);

//    strcpy(p, "iPhone");

//    printf("%s\n",p);

//    

//    // 如果对p进行指针的重指向,原本保存堆空间的地址被替换,这部分空间就找不到了,发生这种问题称为内存泄露

//    

//    // 回收

//    free(p);

//    // 过度释放

////    free(p);

//    p[2] =97;

//    printf("%c\n",p[2]);

    

    // 野指针:堆一块已经释放掉的内存进行操作

    

 

    // 1.先使用malloc  .ps.申请相应字节数的空间

    // 2.使用这部分内存

    // 3.别忘了对他进行释放,不要过度释放

    

    // 练习

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

//    char str[] ="dsaddfgjk243djfgop";

//    int num =0;

//

//    

//    for (int i =0; str[i]!=‘\0‘; i++) {

//        if ((str[i]<=‘z‘&&str[i]>=‘a‘)!=1) {

//            num++;

//        }

//    }

//    int numIndex =0;

//    char *p= malloc(num+1);

//    for (int i =0; str[i]!=‘\0‘; i++) {

//        if ((str[i]<=‘z‘&&str[i]>=‘a‘)!=1) {

//            

//            p[numIndex]=str[i];

//            numIndex++;

//    }

//        strcat(p, "\0");

//    }

//

//            printf("%s\n",p);

//   

//    // 为数字进行内存分配,有多少数字相应分配多少字节数

//    //把数字放入到堆空间的字符里

//    //把最后一位的‘\0‘进行赋值

//    // 内存的释放

//    free(p);

    // calloc

    // 用法和malloc差不多,只不过比malloc多一个刷碗的动作,会把每个字节的内容都清零

    // void * calloc(int n, int size)

//    int  *p = calloc(10, sizeof(int ));

//    for (int  i =0; i<10; i++) {

//        printf("%d ", p[i]);

//    }

//    printf("\n");

//    int *p1 =malloc(10*sizeof(int ));

//    for (int i =0; i <10; i++) {

//        printf("%d ",p[i]);

//    }

//    printf("\n");

    

//    int  a =5,b = 10,c =15;

//    //指针数组

//    int *arr[3] ={&a, &b, &c};

//    for(int i =0 ; i< 3;i++){

//        printf("%d\n",*arr[i]);

//    }   

//    char *str[3] = {"iPhone","Win8","Andiod"};

//    for (int i =0; i<3; i++) {

//        printf("%p\n",str[i]);

//    }

    

    //练习

 

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

    

    // 输入三个人的姓名,根据姓名长度,动态分配内存,然后进行储存,最后进行打印

    // 定义一个指针数组

//    char *words[3]={0};

//    for (int i =0; i <3; i++) {

//        char temp[50] ="";

//        scanf("%s",temp);

//        words[i] = calloc(strlen(temp)+1, sizeof(char));//words[i]==char *p

//        strcpy(words[i], temp);

//

//        

//    }

//    for (int  i =0; i < 3; i++) {

//        printf("%s\n",words[i]);

//    }

//    // 释放

//    for(int i=0 ;i< 3;i++){

//        free(words[i]);

//    }

    

     // realloc:重新进行内存的分配

//    int *p = calloc(10, sizeof(int ));

//    int *pNew =realloc(p , 80);

//    printf("%p\n",p);

//    printf("%p\n",pNew);

    

     // 内存操作函数

     // 内存初始化

//    int *p = malloc(40);

//     // 对内存进行初始化设置

//     // 1.要初始化的空间

//     // 2.初始化把值设置成0

//     // 3.设置的范围

//    memset(p, 0, 40);

//    for (int i = 0; i<10; i++) {

//        printf("%d\n",p[i]);

//    }

//    printf("\n");

    

     // 内存的拷贝

     // 第三个参数:拷贝的范围的字节数

//    int *p =calloc(10, sizeof(int ));

//    int *pNew =calloc(10, sizeof(int ));

//    for (int  i=0; i<10; i++) {

//        p[i] =arc4random()%(70-30+1)+30;

//        printf("%d ",p[i]);

//    }

//    printf("\n");

//    memcpy(pNew, p, 40);

//    for (int i =0; i<10; i++) {

//        printf("%d ",pNew[i]);

//    }

//    printf("\n");

    

     // 内存比较

     // 第三个参数:比较的范围

//    int *p1 = calloc(1, sizeof(int));

//    int *p2 = calloc(1, sizeof(int));

//    *p1 =255;

//    *p2 =100;

//    

////    memcmp(<#const void *#>, <#const void *#>, <#size_t#>)

//    printf("%d\n",memcmp(p1, p2, 4)); 

 

    // 定义两个整型指针,分别用malloc.calloc对其分配空间保存3个元素,malloc分配的空间用memset清零,随机对数组进行赋值随机范围1 -3,赋值后用memcmp比较两个数组.如果相同打印Good!否则打印Failed

    

//    int *p1 =malloc(3*sizeof(int));

//    int *p2 =calloc(3,sizeof(int));

//    memset(p1, 0, 12);

//    for (int i =0; i<3 ; i++) {

//        p1[i]=arc4random()%1;

//        p2[i]=arc4random()%1;

//        printf("%d %d\n",p1[i],p2[i]);

//    }

//    if (memcmp(p1, p2, 12) == 0) {

//        printf("Good\n");

//    }else{

//        printf("Failed\n");

//    }  

//    free(p1);

//    free(p2);

       return 0;

}

动态内存分配

标签:

原文地址:http://www.cnblogs.com/cmle/p/4644017.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!