美文网首页
C语言基础入门必读---内存分配

C语言基础入门必读---内存分配

作者: iwen大大怪 | 来源:发表于2019-08-05 21:21 被阅读0次

    首先,我们应该知道。所有的程序都必须留出足够的内存空间来存储所使用的数据,所以我们常常会预先给程序开辟好内存空间,然后进行操作,比如我们平常使用的数组就是这样子的。数组我们在定义的时候必须给提前开辟好空间。而且在程序运行的过程中,这个开辟的内存空间是一直存在的。除非等到这个函数运行完成,系统才会将空间释放。但事实上另一个问题就是这个数组在程序中无法被改动。另一种选择,能够让内存分配自己主动进行下去。下面我就来介绍在C语言中如何动态分配内存。

    内存分配实例

    1.从静态区分配内存

    静态区是用来存放全局初始化变量和为初始化变量,如果我们定义一个变量,系统会自动的在静态区为其分配内存空间。如:

    #include"stdio.h"
    //全局变量存在静态区
    int a, b, c, d;
    int array[10] = { 0 };
    
    int main() 
    {
        return 0;
    }
    

    例子中的a b c d就是在静态区分配内存空间的。

    2.从栈中分配内存

    栈内存在函数中定义的一些基本类型的变量和对象的引用变量(形参 地址等)都在函数的栈内存中分配。如:

    #include"stdio.h"
    //全局变量存在静态区
    int a, b, c, d;
    int array[10] = { 0 };
    
    int main() 
    {
        int temp = 0;
        char name[20] = { "Hello Word!" };
    
        return 0;
    }
    

    temp name这些变量就是在栈上定义的变量,但是需要注意的是,定义的内存不能超过栈的内存,否则会导致栈内存的泄露。

    3.从堆中分配内存

    在C语言中,想要从堆中分配内存就要调用mallo函数进行分配

    #include"stdio.h"
    #include <malloc.h>
    //全局变量存在静态区
    int a, b, c, d;
    int array[10] = { 0 };
    int main() 
    {
        int temp = 0;
        char naame[20] = { "Hello Word!" };
    
        //从堆中分配内存,表示从堆上分配30个double大小的内存空间
        char* p;
        p = (char*)malloc(30 * sizeof(char));
    
        //判断内存是否分配成功
        if (p==NULL)
        {
            //分配失败
            return 0;
        }
        //"HelloWorld\n"写入p指向的地址
        sprintf(p, "%s", "HelloWorld\n");
        //输出数据
        printf("%s\n", p);
        //释放内存空间
        free(p);
        return 0;
    }
    

    4.calloc()函数和realloc()函数

    calloc()函数与malloc()函数有同样之处。也有类似之处。

    short *p;
    newmem=(short *)calloc(1000,sizeof(short));
    

    通过这个样例,我们能够知道calloc()函数有两个參数。而且这两个函数都是size_t类型(unsigned int类型)的数。第一个參数在这里所说的是所须要开辟的内存单元数量。第二个參数是每一个单元的字节的大小。

    void *calloc(size_t ,size_t);
    

    calloc()函数另一个特性。它将块中的所有位都置为0。这也是calloc()函数和malloc()函数的差别,calloc()函数和malloc()函数的另外一个差别是他们请求内存数量的方式不一样。当然。free()函数也能够来释放calloc()函数分配的内存。
    realloc()函数用来改动一个原先已经分配的内存的大小。使用这个函数,你能够让一块内存增大还是缩小。当扩大时。这块内存原先的内容会依旧保留,新添加的加入到原先的后面。缩小时,该内存的尾部部分内存去掉,剩余保留。

    注意:对于realloc()函数。假设原先的内存无法改动。这时候realloc()函数再会分配一块内存。而且把原先那块内存的内容拷贝到上面去。所以。使用了realloc函数以后,你这时候在使用的就该是realloc函数返回的新指针了。当realloc函数的第一个參数是NULL时,这时候我们能够把它当作是malloc()函数。

    相关文章

      网友评论

          本文标题:C语言基础入门必读---内存分配

          本文链接:https://www.haomeiwen.com/subject/qlqjdctx.html