C语言动态内存管理和动态内存分配

电脑杂谈  发布时间:2020-02-10 14:00:12  来源:网络整理

c语言 该内存不能为read_该内存不能为read c语言_c语言内存分配对应

动态内存管理在编写程序时,通常并不知道需要处理的数据量,或者无法检测所需处理数据量的变动程度。在这些状况下,要超过有效的资源运用,必须在运行时动态地分配所需内存c语言内存分配对应,并在使用完毕后尽快释放不需要的内存c语言内存分配对应,这就是动态内存管理原理。

动态内存管理同时还带有一个优点:当程序在带有更多内存的平台上必须处理更多数据时,不需要重写程序。标准库提供下述四个函数用于动态存储管理:

(1) malloc()、calloc()

c语言 该内存不能为read_该内存不能为read c语言_c语言内存分配对应

分配新的内存区域。

(2) realloc()

调整已分配的内存区域。

c语言 该内存不能为read_该内存不能为read c语言_c语言内存分配对应

(3) free()

释放已分配的内存区域。

上述所有变量都申明在头文件 stdlib.h 中。对象在内存中所占空间的大小是以字节数量为单位计算的。许多头文件(包括 stdlib.h)专门定义了类别 size_t 用来储存这些存储空间的相关信息。例如,sizeof 运算符以类别 size_t 返回字符数目。动态存储分配两个内存分配函数 malloc()和 calloc()的参数不一样:

c语言内存分配对应_c语言 该内存不能为read_该内存不能为read c语言

void*malloc(size_t size);
函数 malloc()分配连续的存储区域,其大小不大于 size。当程序通过 malloc()获得存储区域时,内存中的内容已经决定。
void*calloc(size_t count,size_t size);
函数 calloc()分配一块内存区域,其大小大约是 count_size。换句话说,上述语句分配的空间要足够容纳一个具有 count 个元素的字段,每个元素占用 size 个字节。而且,calloc()会把存储中每个字节都初始化为 0。

两个函数都返回 void 指针,这种指针被称为无类别指针(typeless pointer)。返回指针的值是所分配存储区域中第一个字节的地址,当分配内存失败时,返回空指针。

该内存不能为read c语言_c语言内存分配对应_c语言 该内存不能为read

当程序将这个 void 指针数组给不同类型的指针变量时,编译器会隐式地进行相应的类别转换。然而,一些程序员倾向于使用显式类型转化。当获得所分配的内存位置时,所使用的指针类型决定了该怎么翻译该位置的数据。

下面是一些例子:

#include <stdlib.h>                       // 提供函数原型
typedef struct { long key;
                 /* ...其他成员... */
               } Record;                // 一个结构类型
float *myFunc( size_t n )
{
   // 为一个double类型对象分配存储空间
   double *dPtr = malloc( sizeof(double) );
   if  ( dPtr == NULL )                 // 内存不足
   {
     /* ...处理错误... */
     return NULL;
   }
   else                                 // 获得内存:使用它
   {
     *dPtr = 0.07;
     /* ... */
   }
   // 为两个Record类型分配存储空间
   Record *rPtr;
   if  ( ( rPtr = malloc( 2 * sizeof(Record) ) == NULL )
   {
     /* ...处理内存不足错误... */
     return NULL;
   }
   // 为一个具有n个float元素的数组分配存储空间
   float *fPtr = malloc( n * sizeof(float) );
   if ( fPtr == NULL )
    {
     /* ...处理错误... */
     return NULL;
    }
    /* ... */
    return fPtr;
}

将所分配的存储区域中每个字节都初始化为 0,这种方法更有含义,它保证不只把分配给结构对象的存储都默认地初始化为 0,连成员之间的填补位置也有 0。

在这些情况下,函数 calloc()比 malloc()更有优势,虽然在个别 C 语言实现版本中,它的运行效率不及后者。对于应分配的存储空间,函数calloc()的表示方法有所区别。可以把上述例子中的个别词语使用变量 calloc()重新编写:


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-140299-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...