一起学习C语言:初谈指针(三)

  上一篇<一起学习C语言:初谈指针(二)> 中,我们了解了进程中的内存区域,以及动态管理内存空间方式。本篇文章中,我们分析更多的动态分配函数,并通过示例来了解不同场景中的动态内存的分配、使用和释放方式。

章节预览:


7. 常见的动态分配函数
8. 本章总结
目录预览

章节内容:


7. 常见的动态分配函数

  在一些场景中,由于malloc函数分配方式较为局限性,而不能满足使用要求。接下来,我们了解更多关于内存分配的函数。

  1. 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);

 

  1. 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.


  1. _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.


  1. _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;


8. 本章总结

  本章节,我们简单了解了进程中的不同内存区域以及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语言:初谈指针(二)>

你可能感兴趣的:(一起学习C语言)