A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始


6.动态内存分配:一般按照可以容纳可能出现的最多元素来做

优点:简单

缺点:声明中引用了限制,如果程序需要使用的元素超过声明的长度:

  • 解决的方法是把数组声明的更大一些,但是同时新的缺点又出现了,如果程序实际需要的元素数量比较少时,这样绝大部分的内存空间都被浪费了
  • 如果超过数组容纳的范围时,程序必须有合理的响应,不应该由于一个异常而失败,但也不应该printf看上去正确实际错误的结果


7.常用动态分配内存分配函数:

   C语言中提供了3个动态内存分配函数:


    1)malloc 函数


      格式: void * malloc(unsigned size);


      从内存的堆区分配大小为size个字节的连续的内存空间

      如果内存分配成功 返回内存的首地址


                失败  NULL




#include <stdio.h>

#include <stdlib.h>

/**

* malloc函数的使用

*/

void test1(){


    //从内存中申请一块内存空间,可以存储4个整数

    // = 赋值,要求等号的左右两侧的类型要一致

    //p中存放的事新申请的内存空间的首地址

    //注意:malloc 申请的内存空间,如果我们不赋值?

    //     是垃圾数

    int *p = (int*)malloc(4*sizeof(int));   //16个字节

   

    //使用一个函数给malloc申请的空间进行初始化

    memset(p,'a',16);

   

    if (p!=NULL) {

        

        //申请成功做的事情

        //        *p = 10;

        //        *(p+1) = 100;

        //        *(p+2) = 1000;

        //        *(p+3) = 10000;   //存放4个整数

        

    }else{

        //内存申请失败

        printf("内存申请失败!\n");

        

    }

   

    for(int i=0;i<4 ;i++){

        

       printf("%c\t",*(p+i));

        

    }


}


void test2(){


    //calloc 分配指定块数和长度的内存空间

    //格式:calloc(块数,长度)

    //分配了4块,每一块内存长度为4的内存空间

    //他们的地址也是连续的

   

    //注意事项:

    //calloc 它使可以帮我们自动的初始化为0

    int *p = (int *)calloc(4,sizeof(int));   //16个字节

   

    if (p!=NULL) {

        

        //申请成功做的事情

        *p = 10;

        *(p+1) = 100;

        *(p+2) = 1000;

        *(p+3) = 10000;   //存放4个整数

        

    }else{

        //内存申请失败

        printf("内存申请失败!\n");

        

    }

   

    for(int i=0;i<4 ;i++){

        

       printf("%d\t",*(p+i));

        

    }


}

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

   

    int *p = (int*)malloc(4*sizeof(int));   //16个字节

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

    //realloc 函数可以给已经存在的空间扩充大小

    p = realloc(p, 40*sizeof(int));

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

    //40个内存空间

    if (p!=NULL) {

        

        //申请成功做的事情

        *p = 10;

        *(p+1) = 100;

        *(p+2) = 1000;

        *(p+3) = 10000;   //存放4个整数

        

        *(p+39)= 1;

       printf("%d\n",*(p+39));

        

    }else{

        //内存申请失败

        printf("内存申请失败!\n");

   

    }

   

    for(int i=0;i<4 ;i++){

   

       printf("%d\t",*(p+i));

   

    }

   

    return 0;

}



0 个回复

您需要登录后才可以回帖 登录 | 加入黑马