malloc&calloc&realloc

前言

  • 动态存储分配函数头文件malloc.h(ANSI标准建议使用stdlib.h,但很多编译器可能不支持);

  • 动态存储分配均是在堆上进行的;

  • free()用来释放这三个函数分配的内存空间;

malloc函数

分配指定大小的内存空间;

void* malloc (size_t size);
  • size为0,会返回一个合法指针,且该指针可以通过free去释放

使用:

int * p =null;
p= (int *) malloc(sizeof(int) * 10);
memset(p, 0, sizeof(int) * 10 );

calloc函数

分配指定大小的内存空间,将每一个字节都初始化为 0

void* calloc (size_t num, size_t size);

使用:

int * p = (int *) malloc(sizeof(int) * 10);

realloc函数

对已经分配过的堆空间,重新分配内存空间;

void* realloc (void* ptr, size_t size);
  • realloc运行时会复制原数据,寻找新的足够空间,成功后会释放原空间,失败不回收
  • 新的大小一定要大于原来的大小,不然的话会导致数据丢失!
  • size为0,原空间会被释放,但无新的空间开辟,类似free();
  • realloc 并不保证调整后的内存空间和原来的内存空间保持同一内存地址;

使用:

int main ()
{
    int input,n;
    int count = 0;
    int* numbers = NULL;
    do {
        printf ("Enter an integer value (0 to end): ");
        scanf ("%d", &input);
        count++;
                
         numbers = (int*) realloc (numbers, count * sizeof(int));
      //原内存被free,需要重新赋地址给原指针
        if (numbers!=NULL) {      //空间不足,分配失败,会返回NULL
            numbers[count-1]=input;
        }else {
            free (numbers);
            puts ("Error (re)allocating memory");
            exit (1);
        }

    } while(input!=0);
    printf ("Numbers entered: ");
    for (n=0;n<count;n++) printf("%d ",numbers[n]);
    free (numbers);
    system("pause");
    return 0;
}    

Reference

1.C语言realloc()函数:重新分配内存空间

2.C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别

3.realloc重分配内存详解

4.realloc使用误区

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。