分配记忆
标准分配
C 动态内存分配函数在 <stdlib.h>
头中定义。如果希望动态地为对象分配内存空间,可以使用以下代码:
int *p = malloc(10 * sizeof *p);
if (p == NULL)
{
perror("malloc() failed");
return -1;
}
这计算了 10 个 int
s 在内存中占用的字节数,然后从 malloc
请求许多字节并将结果(即,使用 malloc
创建的内存块的起始地址)分配给名为 p
的指针。
优良作法是使用 sizeof
来计算要请求的内存量,因为 sizeof
的结果是实现定义的(除了字符类型,char
,signed char
和 unsigned 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) 对齐的值应该是实现支持的有效对齐。未能满足其中任何一个会导致未定义的行为 。