精华内容
下载资源
问答
  • 动态分配内存

    2019-03-24 10:11:00
    动态分配内存,指针也可以用[ ]进行操作,因为数组就是一种特殊的指针

    动态分配内存,指针也可以用[ ]进行操作,因为数组就是一种特殊的指针

    展开全文
  • 问:为什么要动态分配内存 答1:因为内存太宝贵。 答2:如果全部是静止内存不能释放,对于小的程序可以运行完毕。但是对于大的程序,还没运行完,内存就要被占用完,此时就要发生内存泄露。 答3:给定一个占用...

    问:为什么要动态分配内存

    答1:因为内存太宝贵。

    答2:如果全部是静止内存不能释放,对于小的程序可以运行完毕。但是对于大的程序,还没运行完,内存就要被占用完,此时就要发生内存泄露。

    答3:给定一个占用内存可变大小的变量(假设是数组的长度len),给该变量通过函数动态分配内存后,分配内存的大小是根据数组的长度len决定的,假定用户输入len的大小是5,系统就会动态的给该数组分配长度为5的内存,该段代码运行结束后,系统调用free()函数释放分配的内存,然后接着运行剩下的程序。换句话说,动态分配内存可以根据需要去申请内存,用完后就还回去,让需要的程序用。

    问:什么时候需要动态分配内存

    答:当程序中有比较大的数据块需要使用内存的时候使用。原因:比较大的数据块如果使用了静态内存,在该数据块运行完毕后不能动态的释放该内存,直到整个程序运行完才能释放,如果整个程序比较大,有可能因为内存不够而发生错误。

    问:难道不可以在该静态分配的内存使用完后,使用free()函数释放吗?

    答:不可以,首先malloc() 函数和free()函数必须是配套使用,其次free()函数不能释放普通变量,只能释放指针。

    问:什么时候需要动态分配内存(网友整理:https://blog.csdn.net/sinat_39085247/article/details/74356820

    答:什么时候我们需要动态分配内存空间呢?举一个例子吧。int *p; 我们定义了一个指向int类型的指针p;p是用来储存一个地址的值的,我们之所以要为p这个变量分配空间是让它有一个明确的指向,打个比方吧!你现在做好了一个指向方向的路标,但是你并没有让这个路标指向一个确切的方位,也就是说现在的这个路标是瞎指向的,这样我们就不能够通过它来明确到底哪里是东,哪里是西,何为北,何为南了。虽然我们在计算机的内存里定义了一个指针变量,但是我们并没有让这个变量指示一个确切int类型变量的地址,所以我们就必须要让它有一个明确的指示方向。这样我们就要通过动态分配内存的方式来认为的规定它的方向!

         计算机内存的四大区域:栈区,常量区,全局区,堆区(动态分配)

    1. 栈   区:在栈里面储存一些我们定义的局部变量以及形参;
    2. 常量区:主要是储存一些字符常量;
    3. 全局区:在全局区里储存一些全局变量和静态变量;
    4. 堆       :堆主要是通过动态分配的储存空间;

    以数组为例子来说明动态分配和释放内存

    #include<stdio.h>
    #include<malloc.h>
    int main()
    {
    	int len;//定义数组的长度
    	int *pArr=(int *)malloc(sizeof(int)*len);
    	for(int i=0;i<len;++i)
    		scanf("%d"\n,&pArr[i]);
    	for(i=0;i<len;++i)
    		printf("%d\n",*(pArr+i));
        free(pArr);  //pArr指向数组的首地址
        pArr = NULL;
        /*...
        剩余代码
        ...*/
    	return 0;
    	
    }

    问:为什么malloc函数前面需要int *的强制转换?

    答:因为程序需要告诉编译器malloc函数返回值的第一个字节是int *类型的还是其他类型的。

    1:代码中的malloch函数分配内存,在该段代码运行完后,通过free()函数释放,被释放的内存空间留着可以被剩余代码接着利用。

    2:同时当我们使用malloc()函数的时候还应该注意当我们释放完空间的时候还要将原先的指针变量赋予一个NULL,也就是赋予一个空指针,留着下次的时候使用它!如果我们不赋予|NULL行不行呢??答案是:不行的!如果我们不赋予一个空指针这样会导致原先的指针变量成为了一个野指针,何谓野指针?野指针就是一个没有明确指向的指针,系统不知道它会指向什么地方,野指针是很危险的,因此当我们每次使用完malloc()函数的时候都必须将指针赋予一个空指针!

    展开全文
  • 首先,在使用动态分配内存技术前,必须明白自己在做什么,这样做与其它的方法有什么不同,特别是会产生哪些负面影响,天下没有免费的午餐。动态分配内存与静态分配内存的区别: 1) 静态内存分配是在编译时完成的...

            首先,在使用动态分配内存技术前,必须明白自己在做什么,这样做与其它的方法有什么不同,特别是会产生哪些负面影响,天下没有免费的午餐。动态分配内存与静态分配内存的区别:

    1) 静态内存分配是在编译时完成的,不需要占用CPU资源;动态分配内存是在运行时完成的,动态内存的分配与释放需要占用CPU资源;
    2) 静态内存分配是在栈上分配的,动态内存是堆上分配的;
    3) 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要;
    4) 静态分配内存需要在编译前确定内存块的大小,而动态分配内存不需要编译前确定内存大小,根据运行时环境确定需要的内存块大小,按照需要分配内存即可。可以这么说,静态内存分配是按计划分配,而动态内存分配是按需分配。
    5) 静态分配内存是把内存的控制权交给了编译器,而动态内存是把内存的控制权交给了程序员;

    综上所述,静态分配内存适合于编译时就已经可以确定需要占用内存多少的情况,而在编译时不能确定内存需求量时可使用动态分配内存;但静态分配内存的运行效率要比动态分配内存的效率要高,因为动态内存分配与释放需要额外的开销;动态内存管理水平严重依赖于程序员的水平,如果处理不当容易造成内存泄漏。那么再具体些,如何选择内存分配方式,如果动态分配内存需要注意哪些问题呢?

    需要强调的是,由于动态分配内存把内存的控制权交给了程序员,程序员有义务写代码确认内存分配成功能,如果分配失败要做适当处理,否则将给你的程序进而下一个定时炸弹,随时有可能因为动态内存分配失败而导致程序崩溃。

    1. 全局变量尽可能不要动态分配内存。

    既然将变量定义为全局变量,就为了其可见范围比较宽,因为可能这些变量在整个程序的运行期都是可见的,可能根本就没有机会释放全局变量所占用的内存,所以使用动态分配内存是意义不大的,只能给程序带来额外的运行负担。
    但对于全局变量内存大小不能确定的情况,可能会有例外。比如要处理一批数据,数据的大小可能由用户通过控制台参数形式告诉程序,这种情况可以动态按需分配内存,合理使用内存。
    而对于编译时能够确定内存使用量的全局变量,而且变量工作期(暂且这么叫吧,就是该变量还可能会被用到的这段时期)又与程序的运行期相同的情况根本没有必要动态分配内存。这种情况很有意思,就是使用动态分配内存,但可以不考虑释放这块内存,因为可以释放内存的时候该程序也要退出了,程序一结束,进程也就结束了,整个程序所在的虚拟空间已经被全部释放,也就没必要去添加释放内存的代码了。(但我确定见到过这样的代码)

    2. 动态分配内存时,分配与释放的代码要对称。

    这里说的分配与释放的代码对称指,分配内存的代码要与释放内存的代码在同一个范围的代码域中,例如在一个函数的开头申请内存,就应该在这个函数的结尾释放内存,否则,如果在一个函数内部分配内存,在函数外释放内存,就有可能因程序员的疏忽造成内存泄漏;如果内存分配在某个类的构造函数中,那么就应该在析构函数中释放内存,千不要在另外一个函数中释放,而等着客户代码去掉用那个函数去手动释放内存,如果那样的话就相当于埋了一个定时炸弹,随时可能因为一时的疏忽而造成内存泄漏。

    3. 对动态创建的对象或分配的内存块一定要检查期有效性。

    由于操作系统的并发性和复杂性,任何一次动态内存的分配操作都有可能失败,特别是申请一次较大块内存时。所以一定要检查动态创建的对象或申请的堆内存是否成功,否则可能因为错误的指针或空指针造成程序异常,如果异常没有得到适当处理的话,可能使整个程序意外终止,造成损失。

    4. 尽可能少次数地使用动态内存分配。

    动态分配是在运行时由操作系统完成的,所以是要消耗CPU资源的,在进行动态内存分配时尽可能便利已经分配的资源。如果上次申请的资源够用就不要重新申请资源,不够用时才释放旧资源,申请新资源。

    5. 在保证资源利用率的前提下,能用静态内存分配不用动态分配,特别是局部临时对象。

    例如,对于局部对象,使用静态分配的内存,可以由编译器编译时分配,超出作用域自动内存,不仅减小了程序代码,减少了错误产生的概率,减轻了程序员的负担,而且提高的程序的执行效率,何乐而不为呢?

    展开全文
  • 在C中动态分配内存的基本步骤有: 1,用malloc类的函数分配内存; 2,用这些内存支持应用程序 3,用free函数释放内存 二、动态内存分配函数  malloc :从堆上分配内存  realloc : 在之前分配的内存块的基础上,将内存...

    #include<stdio.h>

    /**
    在C中动态分配内存的基本步骤有:
    1,用malloc类的函数分配内存;
    2,用这些内存支持应用程序
    3,用free函数释放内存
    二、动态内存分配函数
        malloc :从堆上分配内存
        realloc : 在之前分配的内存块的基础上,将内存重新分配为更大或者更小的部分
        calloc: 从堆上分配内存并清零
        free:将内存块返回堆
    */
    void mainaa()
    {
        int *pi = (int*) malloc(sizeof(int));
        *pi = 5;
        printf("*pi:%d\n",*pi);
        free(pi);
    }
    //为字符串分配内存,将其初始化,并逐个字符打印字符串,然而每次迭代name都会增加1,最后name会指向字符串结尾的NUL字符,
    //分配内存的起始地址丢失了
    void mainbb()
    {
        //为10个双精度浮点数分配空间,需要80个字节
        //double *pd = (double*)malloc(NUMBER_OF_DOUBLES*sizeof(double));
        //以下程序只分配了10个字节
        const int NUMBER_OF_DOUBLES = 10;
        double *pd = (double*)malloc(NUMBER_OF_DOUBLES);

        //初始化静态或全局变量时不能调用函数,下面的代码声明一个静态变量,并试图用
        //malloc来初始化,这样会产生一个编译时错误消息
        //static int *pi = malloc(sizeof(int));

        char *name = (char*)malloc(strlen("Susan")+1);
        strcpy(name,"Susan");

        while(*name != 0){
            printf("%c",*name);
            name++;
        }
    }
    /**
        使用calloc函数
        calloc会在分配的同时清空内存,该函数的原型如下:void *calloc(size_t numElements,size_t elementSize);
        calloc函数会根据numElements和elementSize两个参数的乘积来分配内存,并返回一个指向内存的第一个字节的指针。如果不能分配内存
        则返回null,此函数最初用来辅助分配数组内存。
        如果numElements或elementSize为0,那么calloc可能返回空指针。如果calloc无法分配内存就会返回空指针,而且全局变量errno会设置为ENOMEM(内存不足),
        这是POSIX错误码,有的系统上可能没有
    **/
    void maincc()
    {
        //下面两端代码都是为pi分配了20字节,全部包含0
        //int *pi = calloc(5,sizeof(int));

        //int *pi = malloc(5*sizeof(int));
        //memset(pi,0,5*sizeof(int));

        /**
            memset函数会用某个值填充内存块,第一个参数是指向要填充的缓冲区的指针,第二个参数是填缓冲区的值,最后一个参数是要填充的字节数。
            如果内存需要清零可以使用calloc,不过执行calloc可能比执行malloc慢。cfree函数已经没用了。
        */
    }
    /**
        realloc函数
        realloc函数会重新分配内存,原型:void *realloc(void *ptr,size_t size);
        realloc函数返回指向内存块的指针。该函数接受两个参数,第一个参数是指向原内存块的指针,第二个是请求的大小。重新分配的块大小和第一个参数
        引用的块大小不同。返回值是指向重新分配的内存的指针。
        请求的大小可以比当前分配的字节数小或者大。如果比当前分配的小,那么多余的内存会还给堆,不能保证多余的内存会被清空。如果比当前分配的大,
        那么可能的话,就在紧挨着当前分配内存的区域分配新的内存,否则就会在堆的其他区域分配并把旧的内存复制到新区域。
        如果大小是0而指针非空,那么就释放内存。如果无法分配空间,那么原来的内存块就保持不变,不过返回的指针是空指针,且errno会设置为ENMOEM,
    **/
    void maindd()
    {
        /**
            下例使用两个变量为字符串分配内存。一开始分配16个字节,但只用到了前面的13个字节(12个十六进制数字外加null结束字符(0))
        */
        char *string1;
        char *string2;
        string1 = (char*)malloc(16);
        strcpy(string1,"0123456789AB");
        
        /**
            紧接着,用realloc函数指定一个范围更小的内存区域。然后打印这两个变量的地址和内容
        */
        string2 = realloc(string1,8);
        printf("string1 value:%p [%s]\n",string1,string1);
        printf("string2 value:%p [%s]\n",string2,string2);
    }
    /**
        alloca函数和变长数组
        alloca函数(微软为malloca)在函数的栈帧上分配内存。函数返回后会自动释放内存。若低层的运行时系统不基于栈,
        allocal函数会很难实现,所以这个函数时不标准的,如果应用程序需要可移植就尽量避免使用它。
        C99引入了变长数组(VLA),允许函数内部声明和创建其长度由变量决定的数组,比如:
        void compute(int size){
            char * buffer[size];
            ...
        }
        这意味着内存分配在运行时完成,且将内存作为栈帧的一部分来分配。另外,如果数组用到sizeof操作符,也是在运行时而不是编译时执行。
        这么做只会有一点小小的运行时开销。而且一旦函数退出,立即释放内存。因为我们没有用malloc这类函数来创建数组,所以不应该用free函数来
        释放它。alloca函数也不应该返回指向数组所在内存的指针,但是可以解决。
        VLA的长度不能改变,一经分配其长度就固定了。
    **/

    /**
        动态内存分配技术
        1,资源获取即初始化
        资源获取即初始化(Resource Acquisition Is Initialization,RAII)是Bjarne Stroustrup发明的技术,可以用来解决C++中资源的分配和释放。
        即使有异常发生,这种技术也能保证资源的初始化和后续的释放。分配的资源最终总是会得到释放。
        有好几种方法可以在C中使用RAII。GNU编译器提供了非标准的扩展来支持这个特性,通过演示如何在一个函数中分配内存然后释放可以说明这种
        扩展。一旦变量超出作用域会自动触发释放过程。
        GNU的扩展需要用到RAII_VARIABLE宏,它声明一个变量,然后给变量关联如下属性
            1,一个类型。
            2,创建变量时执行的函数。
            3,变量超出作用域时执行的函数。
        这个宏如下所示:
            #define RAII_VARIABLE(vartype,varname,initval,dtor)\
                void _dtor_ ## varname (vartype * v){dtor(*v);}\
                vartype varname __attribute__((cleanup(_dtor_ ## varname))) = (initval)
        在下例中,我们将name变量声明为字符指针。创建它时会执行malloc函数,为其分配32字节。当函数结束时,name超出作用域就会执行free函数:
        void raiiExample(){
            RAII_VARIABLE(char*,name,(char*)malloc(32),free);
            strcpy(name,"RAII Example");
            printf("%s\n",name);
        }
        函数执行后会打印"RAII_Example"字符串。不用GNU扩展也可以达到类似效果。
        2、使用异常处理函数
        另外一种处理内存释放的方法是利用异常处理。尽管异常处理不属于标准C,但如果可以使用它且不考虑移植问题,它会很有用。下面说明利用
        Microsoft Visua Studio版的C语言的方法。
        这里的try块包含任何可能在运行时抛出异常的语句。不管有没有异常抛出,都会执行finally块,因此也一定会执行free函数。
        void exceptionExample(){
            int *pi = NULL;
            __try{
                pi = (int*)malloc(sizeof(int));
                *pi = 5;
                printf("%d\n",*pi);
            }
            __finally{
                free(pi);
            }
        }
    */

    展开全文
  • mfc 动态分配内存

    2016-12-14 10:32:00
     为数组动态分配内存  为多维数组分配内存  释放内存delete malloc free  动态内存分配new int * pi; pi= new int ;  为数组动态分配内存 int * pi; pi=new int[8]; ...
  • 动态分配内存与静态内存

    千次阅读 2016-06-03 22:23:22
    动态分配内存是在运行时完成的,动态内存的分配与释放需要占用CPU资源; 2) 静态内存分配是在栈上分配的,动态内存是堆上分配的; 3) 动态内存分配需要指针或引用数据类型的支持,而静态内存分配不需要; 4) 静态...
  • C语言动态分配内存

    万次阅读 2018-06-18 15:45:24
    C语言动态分配内存 malloc 动态开辟内存的函数: void* malloc (size_t size); 这个函数向内存申请⼀块连续可⽤的空间,并返回指向这块空间的指针 如果开辟成功,则返回⼀个指向开辟好空间的指针 如果开辟...
  • C++ 动态分配内存

    千次阅读 2016-10-01 15:16:47
    静态方法:变量所占的内存空间不需要程序员自己管理,编译器在编译阶段自动将管理这些空间的代码加入到目标文件中,程序运行时,由操作系统自动为变量分配内存单元,在变量的生存期内,...动态分配内存:程序运行时根
  • Delphi 动态分配内存

    千次阅读 2016-11-14 11:25:02
    动态分配内存 ① GetMem(var P: Pointer; Size: Integer);//分配 ② AllocMem(Size: Cardinal):Pointer; //分配Size大小空间,并初始化为0 返回分配到的指针 ③ FreeMem(Var P: Pointer); //释放以上分配方式...
  • C语言为指针动态分配内存
  • 堆栈与动态分配内存空间

    千次阅读 2017-11-04 14:30:55
    C/C++的动态分配内存空间。
  • 首先,在使用动态分配内存技术前,必须明白自己在做什么,这样做与其它的方法有什么不同,特别是会产生哪些负面影响,天下没有免费的午餐。动态分配内存与静态分配内存的区别: 1) 静态内存分配是在编译时完成的,...
  • C语言中动态分配内存

    千次阅读 2013-10-27 10:07:09
    所谓动态分配内存指的是C语言允许建立内存动态分配区域,需要时开辟,不需要时释放,这个动态存储区成为堆。 怎样建立内存的动态分配:主要有四个库函数:malloc calloc free realloc  1.malloc
  • c语言 什么时候需要malloc动态分配内存

    千次阅读 多人点赞 2019-01-17 10:22:13
    我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗?? 既然有人会问这样的问题,那么我在这里好好的讲解一下吧! ...
  • 有些数组的长度只有在运行时才知道,所以就用到了动态分配内存,下面的程序就是来演示读取一列整数,并按升序进行排列,并打印出来。/* ** 读取,排序,打印一列整数值 */ #include &lt;stdlib.h&gt; #...
  • 动态分配内存空间过程

    千次阅读 2013-10-19 22:10:22
    动态分配内存空间过程 本篇文章仅以一个非常短小的程序进行讲解。 C编译系统提供4个内存动态分配函数:calloc(),malloc()用于动态申请内存空间,realloc()用于重新改变已分配的动态内存空间的大小,free()用于...
  • 比如 struct class{ int data[100]; }; 怎么给data数组动态分配内存?用malloc()或calloc()函数。
  • 在C语言中我们可以利用标准库函数中的 malloc 和 free 来动态分配内存空间,而在C++中提供了运算符 new 和 delete 来取代 malloc 和 free 进行动态分配内存空间。 2.new的用法表达式 new 数据类型 ; //申请内存...
  • C中动态分配内存

    千次阅读 2014-05-15 18:15:59
    随时随地阅读更多技术实战干货,... //使用动态分配内存时,要包含头文件<stdlib.h> //malloc的参数为要分配的内存的字节数 //其返回所分配内存的第一个字节的地址 //返回类型是void*,但实际中常常转换...
  • c语言 什么时候需要动态分配内存

    千次阅读 多人点赞 2017-07-04 20:47:44
    我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗?? 既然有人会问这样的问题,那么我在这里好好的讲解一下吧!...
  • C++动态分配内存

    万次阅读 2012-09-22 11:09:47
    为啥需要动态分配内存  数组是我们常用的一种数据结构.但它有一个缺点,就是用的时候必须确定数组大小.如果我们要用数组来保存的数据不确定可咋整啊?把数组定得太大浪费空间,太小的话又装不下.这是一种情况.另外...
  • c语言—指针基础(8:动态分配内存)

    千次阅读 2017-12-15 01:34:28
    C语言动态分配内存
  • c语言获得动态分配内存后的数组内存大小 用一个函数 :_msize(); ★注意:该函数为Windows独有★ int* s = (int*)malloc(sizeof(int));  int i;  for(i = 0;i &lt; 1000;i++)  {  s = (int*)realloc(s,...
  • 在日常的编程中,我们难免会用到数组,很多时候由于静态开辟数组空间,导致很多空间浪费又或是空间不足,那么这时候就需要用到动态开辟数组内存。下面就介绍这两种初始化数组的方式: 一、静态分配 指定数组长度 //...
  • c:动态分配内存空间

    千次阅读 2013-10-05 20:25:28
    我讲解一下c语言中动态分配内存的函数,可能有些初学c语言的人不免要问了:我们为什么要通过函数来实现动态分配内存呢?系统难道不是会自动分配内存吗??既然有人会问这样的问题,那么我在这里好好的讲解一下吧!...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,101
精华内容 12,840
关键字:

动态分配内存