C语言内存处理

1.动态存储分配

1.1.内存分配函数

在stdlib.h中声明
(1)malloc():分配内存块,不初始化分配的内存块
(2)calloc():分配内存块,且对内存块进行清除
(3)realloc():调整之前已分配的内存块
malloc不需要对已分配的内存块进行清除

1.2.空指针

调用内存分配函数时,可能会出现出发对所需的最大的内存块进行定位,出现这样的问题,就会返回空指针。

2.动态分配字符串

(1)使用malloc()函数分配

调用该函数分配内存,但没有为其指定名字。而是返回分配的内存区中的一个字节的地址,该地址可以被赋值给一个指针变量,通过指针访问内存。
malloc()函数原型:

void *malloc(size_t size)
(2)字符串函数中使用动态存储分配
//定义一个函数,希望不改变任何一个字符串而完成字符串的拼接
char *newStr;
    newStr =(char *) malloc(strlen(s1) + strlen(s2) + 1);
    if (newStr==NULL)
    {
        printf("ERROR");
        exit(EXIT_FAILURE);
    }
    strcpy(newStr, s1); //s1复制到新内存区
    strcat(newStr, s2); //s2拼接到新字符串后面

3.动态分配数组

3.1.使用malloc分配

//使用malloc 函数申请40个float类型内存空间,使用指针p指向该空间所在位置
float *p;
p=(float*) malloc (40*sizeof(float));

3.2.calloc()函数

函数原型

void *calloc(size_t nmemb, size_t size);

成功分配内存后,该函数会将内存块中的所有位都置0以完成初始化。

long *new;
new=(long*)calloc(100,sizeof(long));

3.3.realloc()函数

函数原型

void *realloc(void *ptr, size_t size);

调用该函数时,指针ptr必须是已经指向了某个内存块,且该内存块必须是之前调用malloc()\calloc()\realloc()函数时分配的。size表示内存块的新尺寸。

如果不能成功完成内存块的扩充,则返回空指针。
如果调用realloc()时将其第一个实际参数设置为空指针,则realloc()就为malloc().
如果调用时以0作为第二个参数,则该函数负责释放掉内存块。

4.释放内存

4.1.free()函数

free()的实参必须是指针,且必须是由free之前的内存分配函数返回的。

4.2.“无效指针”

free()释放了不再需要的内存,节省堆空间。但是指针它的指针仍然存在,指向的仍是之前释放掉的空间。

你可能感兴趣的:(C语言内存处理)