C语言一些常用内存分配函数

首先看个问题程序(这里用的是TC编译器):

 #include "stdlib.h"
 #include "stdio.h"
void main()
{
   int *i;
   i=(int *)malloc(sizeof(int));
   *i=1;
   *(i+1)=2;
   printf("%x|%d\n",i,*i);
   printf("%x|%d",i+1,*(i+1));
}

输出的结果是:
8fc|1
8fe|2
这个程序编译通过,运行正常,说它有问题,问题出在哪呢?

首先通过malloc,建了一个大小为2的堆,
i指向的地址是8fc,i+1指向的地址是8fc+sizeof(int)=8fe
但是地址8fe是不受保护的,因为它不是机器分配给i+1的,随时会被其他变量占用。

正确的做法是

 #include "stdlib.h"
 #include "stdio.h"
void main()
{
   int *i;
   i=(int *)malloc(sizeof(int));
   *i=1;
   i=(int *)realloc(i,2*sizeof(int));//这里用到了realloc函数,重新分配内存
   *(i+1)=2;
   printf("%x|%d\n",i,*i);
   printf("%x|%d",i+1,*(i+1));
}

realloc 可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变。

当然,对于缩小,则被缩小的那一部分的内容会丢失。

realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。但是会尽量去在原来的基础上扩容。当原来的空间不足以容纳的时候会在新的内存扩容且把原来的数据迁移过去,但是要记得top指针的改变。

相反,realloc 返回的指针很可能指向一个新的地址。
所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :
p = (int *) realloc (p, sizeof(int) *15);

甚至,你可以传一个空指针(0)给 realloc ,则此时realloc 作用完全相当于malloc。
int* p = (int *) realloc (0,sizeof(int) * 10); //分配一个全新的内存空间,

这一行,作用完全等同于:
int* p = (int *) malloc(sizeof(int) * 10);

『附注:TC编译器里sizeof(int)=2,VC里面sizeof(int)=4;
char型在两个编译器里是一样的,都是1个字节(8位)』

calloc与malloc相似,参数nelem为申请地址的单位元素长度,elsize为元素个数,如:
char* p;
p=(char*)calloc(sizeof(char),20);
这个例子与上一个效果相同

realloc 可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变(free掉)。

当然,对于缩小,则被缩小的那一部分的内容会丢失。

realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。相反,realloc 返回的指针很可能指向一个新的地址。
所以,在代码中,我们必须将realloc返回的值,重新赋值给 p :
p = (int *) realloc (p, sizeof(int) *15);

个人总结起来其实realloc函数就两点:

realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址。但是会尽量去在原来的基础上扩容。当原来的空间不足以容纳的时候会在新的内存扩容且把原来的数据迁移过去,但是要记得top指针的改变。
原有内存的中内容将保持不变(free掉),也就是说不用手动去free掉

转自:https://www.cnblogs.com/manfredHu/p/4343229.html

calloc

calloc是一个ISO C函数
函数名: calloc
函数原型:void *calloc(size_t n, size_t size);
功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。
n: Number of elements成员数量 size: Length in bytes of each element每个成员字节长度

函数简介
与malloc的区别:
calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据。
用 法:
void *calloc(size_t n, size_t size);
一般使用后要使用 free(起始地址的指针) 对内存进行释放,不然内存申请过多会影响计算机的性能,以至于得重启电脑。如果使用过后不清零,还可以使用指针对该块内存进行访问。
头文件:stdlib.h或malloc.h
相关函数:malloc、realloc、free _alloca
应用举例
编辑
程序例1

 #include
 #include
 #include

int main()
{
    char*str = NULL;

    /*分配内存空间*/
    str = (char*)calloc(10,sizeof(char));

    /*将hello写入*/
    strcpy(str, "Hello");

    /*显示变量内容*/
    printf("String is %s\n",str);

    /*释放空间*/
    free(str);
    return 0;
}

程序例2
从这个例子可以看出calloc分配完存储空间后将元素初始化。

#include
#include
int main()
{
    int i;
    int* pn = (int*)calloc(10, sizeof(int));
    for(i = 0;i < 10;i++)
        printf("%d", pn[i]);
    printf("\n");
    free(pn);
    return 0;
}

输出十个0。

你可能感兴趣的:(c)