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

首先,我们应该知道。所有的程序都必须留出足够的内存空间来存储所使用的数据,所以我们常常会预先给程序开辟好内存空间,然后进行操作,比如我们平常使用的数组就是这样子的。数组我们在定义的时候必须给提前开辟好空间。而且在程序运行的过程中,这个开辟的内存空间是一直存在的。除非等到这个函数运行完成,系统才会将空间释放。但事实上另一个问题就是这个数组在程序中无法被改动。另一种选择,能够让内存分配自己主动进行下去。下面我就来介绍在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()函数。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容