C Language 分配记忆


标准分配

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

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

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

最好使用sizeof来计算要请求的内存量,因为sizeof的结果是实现定义的( 字符类型除外,它们是charsigned charunsigned char ,其sizeof定义为总是1 )。

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

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

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

归零内存

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

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

关于calloc的注释:大多数(常用)实现将优化calloc()以获得性能,因此它比调用malloc() ,然后调用memset() 更快 ,即使净效果相同。

对齐记忆

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) 对齐的值应该是实现支持的有效对齐。未能满足其中任何一个会导致未定义的行为