上一篇<一起学习C语言:初谈指针(二)> 中,我们了解了进程中的内存区域,以及动态管理内存空间方式。本篇文章中,我们分析更多的动态分配函数,并通过示例来了解不同场景中的动态内存的分配、使用和释放方式。
7. 常见的动态分配函数
8. 本章总结
目录预览
在一些场景中,由于malloc函数分配方式较为局限性,而不能满足使用要求。接下来,我们了解更多关于内存分配的函数。
realloc函数
函数原型:void * realloc(void *p, unsigned int size);
函数描述:重新为指针p分配一块长度为size的连续内存空间
函数返回值:内存分配成功将返回所分配区域的第一个字节的地址,分配失败则返回NULL
函数使用分析:p指向一块有效的动态内存,或p是空指针
【例7.7】 定义int类型指针,为指针重新动态分配4个int类型长度。
【方式1】:
int *p = (int *)malloc(sizeof(int));
p = (int *)realloc(p,sizeof(int) * 4);
【方式2】:
int *p = NULL;
p = (int *)realloc(p,sizeof(int) * 4);
calloc函数
函数原型:void * calloc(unsigned int num, unsigned int size);
函数描述:用来分配num个长度为size的连续内存空间
函数返回值:内存分配成功将返回所分配区域的第一个字节的地址,分配失败则返回NULL
函数使用分析:calloc一般做动态数组使用,其中num为元素个数,size为每个元素的长度。另外,calloc函数返回一块干净的内存(内存初始化为0)。
【例7.8】 定义一个int类型动态数组,并存储整数1、2、3、4、5。
int *p = (int *)calloc(5, sizeof(int));
int i = 0;
for (; i < 5; i++) {
*(p + i) = i + 1;
printf(“成员%d,地址:%p 值:%d.\n”, i + 1, &p[i], p[i]);
}
示例结果:
成员1,地址:00108A98 值:1.
成员2,地址:00108A9C 值:2.
成员3,地址:00108AA0 值:3.
成员4,地址:00108AA4 值:4.
成员5,地址:00108AA8 值:5.
_aligned_malloc函数
函数原型:void * _aligned_malloc(unsigned int size, unsigned int alignment);
函数描述:用来分配一块长度为size的连续内存空间,并且内存首地址可以整除alignment
函数返回值:内存分配成功将返回所分配区域的第一个字节的地址,分配失败则返回NULL
函数使用分析:在偏硬件方面使用的内存一般需要手动指定字节数对齐,比如16字节或32字节对齐(内存首地址可以整除这个字节数,部分情况下内存空间也需要整除这个字节数),这种情况属于内存对齐拷贝。由于malloc函数不具备这种特性,一般使用_aligned_malloc函数完成内存对齐分配。
【例7.9】 分配四个int类型内存空间,并按照16字节对齐内存。
int *p = (int *)_aligned_malloc(sizeof(int) * 4, 16);
int i = 0;
for (; p != NULL && i < 4; i++) {
*(p + i) = i + 1;
printf(“p的地址:%p, int%d的地址 %p 值:%d.\n”, p, i + 1, p + i, *(p + i));
}
示例结果:
p的地址:01368BA0, int1的地址 01368BA0 值:1.
p的地址:01368BA0, int2的地址 01368BA4 值:2.
p的地址:01368BA0, int3的地址 01368BA8 值:3.
p的地址:01368BA0, int4的地址 01368BAC 值:4.
_aligned_free函数
函数原型:void _aligned_free(void * memory);
函数描述:用来释放指针memory指向的内存对齐空间,使这块内存空间可以再次被分配使用
函数返回值:无
函数使用分析:由_aligned_malloc函数分配的内存必须由_aligned_free函数释放
【例7.10】 分配四个int类型内存空间,并按照16字节对齐内存,然后释放内存。
int *p = (int *)_aligned_malloc(sizeof(int) * 4, 16);
int i = 0;
for (; p != NULL && i < 4; i++) {
*(p + i) = i + 1;
printf(“p的地址:%p, int%d的地址 %p 值:%d.\n”, p, i + 1, p + i, *(p + i));
}
if (p != NULL)
_aligned_free( p), p = 0;
本章节,我们简单了解了进程中的不同内存区域以及C语言指针变量在不同内存中的使用方式。通过上述示例可以了解到,指针量不是指针,指针量属于存储内存地址的变量或常量,而指针是内存地址。在日常编程中,使用指针需要考虑许多场景,比如内存对齐场景下,需要按照规定来管理、使用。
<一起学习C语言:C语言发展历程以及定制学习计划>
<一起学习C语言:初步进入编程世界(一)>
<一起学习C语言:初步进入编程世界(二)>
<一起学习C语言:初步进入编程世界(三)>
<一起学习C语言:C语言数据类型(一)>
<一起学习C语言:C语言数据类型(二)>
<一起学习C语言:C语言数据类型(三)>
<一起学习C语言:C语言基本语法(一)>
<一起学习C语言:C语言基本语法(二)>
<一起学习C语言:C语言基本语法(三)>
<一起学习C语言:C语言基本语法(四)>
<一起学习C语言:C语言基本语法(五)>
<一起学习C语言:C语言循环结构(一)>
<一起学习C语言:C语言循环结构(二)>
<一起学习C语言:C语言循环结构(三)>
<一起学习C语言:数组(一)>
<一起学习C语言:数组(二)>
<一起学习C语言:数组(三)>
<一起学习C语言:初谈指针(一)>
<一起学习C语言:初谈指针(二)>