分配记忆

标准分配

C 动态内存分配函数在 <stdlib.h> 头中定义。如果希望动态地为对象分配内存空间,可以使用以下代码:

int *p = malloc(10 * sizeof *p);
if (p == NULL) 
{
    perror("malloc() failed");
    return -1;
}

这计算了 10 个 ints 在内存中占用的字节数,然后从 malloc 请求许多字节并将结果(即,使用 malloc 创建的内存块的起始地址)分配给名为 p 的指针。

优良作法是使用 sizeof 来计算要请求的内存量,因为 sizeof 的结果是实现定义的(除了字符类型charsigned charunsigned char,其中 sizeof 被定义为始终给出 1)。

因为 malloc 可能无法为请求提供服务,所以它可能会返回空指针。检查此项以防止以后尝试取消引用空指针非常重要

使用 malloc() 动态分配的内存可以使用 realloc() 调整大小,或者在不再需要时使用 free() 释放。

或者,声明 int array[10]; 将分配相同数量的内存。但是,如果在没有关键字 static 的函数内声明它,它只能在它声明的函数和它调用的函数中使用(因为数组将在堆栈上分配,并且空间将被释放以便重用时函数返回)。或者,如果在函数内部使用 static 定义它,或者如果它在任何函数之外定义,则其生命周期是程序的生命周期。指针也可以从函数返回,但 C 中的函数不能返回数组。

归零内存

malloc 返回的内存可能无法初始化为合理的值,应注意使用 memset 将内存归零或立即将合适的值复制到其中。或者,calloc 返回所需大小的块,其中所有位都初始化为 0。这不必与浮点零或空指针常量的表示相同。

int *p = calloc(10, sizeof *p);
if (p == NULL) 
{
    perror("calloc() failed");
    return -1;
}

calloc 的说明: 大多数(常用)实现将优化性能 calloc(),所以这将是比调用 malloc(),然后 memset(),即使最终的效果是相同的。

对齐记忆

Version >= C11

C11 引入了一个新功能 aligned_alloc(),它使用给定的对齐方式分配空间。如果要分配的内存需要在某些边界对齐,而 malloc()calloc() 无法满足,则可以使用它。malloc()calloc() 函数分配适合任何对象类型的内存 (即对齐方式为 alignof(max_align_t))。但是通过 aligned_alloc() 可以要求更大的对齐。

/* Allocates 1024 bytes with 256 bytes alignment. */
char *ptr = aligned_alloc(256, 1024);
if (ptr) {
    perror("aligned_alloc()");
    return -1;
}
free(ptr);

C11 标准强加了两个限制:1) 请求的大小 (第二个参数)必须是对齐 (第一个参数) 的整数倍,2) 对齐的值应该是实现支持的有效对齐。未能满足其中任何一个会导致未定义的行为