malloc和free

定义于 stdlib.h

malloc 和 free

C 函数库提供了两个函数,malloc 和 free,用于执行动态内存分配和释放。这些函数维护一个可用的内存池。

  • 函数原型

    void *malloc(size_t size);
    void free(void *pointer);

malloc

  • 程序调用 malloc 时,malloc 从内存池中提取一块合适的内存,并向该程序返回一个指向这块内存的指针。
    • 这块内存并未初始化。
    • 初始化:需手动,或使用calloc函数。
  • malloc 的参数是需要分配的字节数。
  • malloc 所分配的是一块连续的内存。
  • malloc 返回的内存严格满足边界对齐要求。

如果内存池是空的,或者可用内存无法满足程序请求,会发生什么呢?

  • malloc 函数向操作系统请求,要求得到更多的内存,并在这块新内存上执行分配任务。如果操作系统无法向 malloc 提供更多的内存,malloc 就返回一个 NULL 指针。
  • 因此,对每个从 malloc 返回的指针都进行检查,确保它非 NULL 是非常重要的。

malloc 返回值

  • 标准表示一个 void *类型的指针可以转换为其他任何类型的指针。有些编译器可能要求在转换时使用强制类型转换。

free

  • free 的参数要么是 NULL,要么是一个先前从 malloc、calloc、realloc 返回的值。
  • 向 free 传递一个 NULL 参数不会产生任何效果。

calloc 和 realloc

原型:

void *calloc(size_t num_elements, size_t element_size);
void realloc(void *ptr, size_t new_size);
  • calloc :两个参数,元素数量和元素的字节数。
  • realloc 用于修改一个原先已分配的内存块的大小。
  • 若 realloc 的第一个参数是 NULL,则它的行为与malloc一模一样。

使用动态分配内存

int *pi;
pi = malloc(100);
// pi指向一个 100字节的内存块
// 在整型为 4个字节的机器上,这块内存被当做 25个整形元素的数组,
// 因为 pi是一个指向整型的指针。
  • 若目标是获得存储 25个整数的内存,这样写具有更好的可移植性

    pi = malloc( 25 * sizeof(int) );
  • 使用内存的方式:既可以使用指针,也可以使用下标。

参考:《C和指针》

你可能感兴趣的:(C)