C语言中malloc函数的使用
观察两段代码:
疑惑为什么不直接使用int定义,而是使用malloc函数来申请内存。
malloc更加灵活!!
使用动态内存分配()来分配内存,是一种在C语言中动态创建数组的方法,这在某些情况下可能会更加灵活。但如果知道数组大小固定为2且不会改变,也可以直接定义一个静态数组。
动态数组与静态数组之分。在相应的功能函数中更推荐使用malloc来定义长度不确定的动态数组。可以使用定义一个int * size变量来确定malloc申请的空间的大小,从而提高内存利用率。
解析malloc函数的用法
以上述代码为例子。malloc函数在堆(heap)上分配一块内存,用于存储两个整数,并将该内存的起始地址赋给指针变量 。它需要一个参数——要分配的内存的字节数。
是一种类型转换,将 返回的通用指针()强制转换为指向 类型的指针。这是因为 返回的指针是通用的,需要将其转换为特定类型的指针。
计算了要分配的内存大小。 表示一个整数的字节数,通常为4个字节(32位系统)或8个字节(64位系统),因此 表示要分配的内存大小为两个整数占用的字节数,以字节为单位。(调用sizeof以便适应不同的系统)
调用 函数来分配内存,这里分配的内存大小为两个整数占用的空间大小。 返回一个指向分配内存起始地址的指针。
赋值:将分配的内存地址赋给 ,这个指针变量可以用来访问这块新分配的内存区域,即存储两个整数的空间。
注:使用 分配的内存要在不使用时手动释放,以避免内存泄漏,用 来释放 指向的内存。
所以将其拆解看为分配内存加强制转换指针类型。
效率分析,不同的内存分配方式
这两段代码在时间效率上的复杂度均为o(1),其实际处理的时间效益也类似。 分配内存的时间通常与请求的内存大小无关,它只是在内存堆中找到足够大的可用内存块并返回指向该块的指针。直接定义静态数组,在编译时确定了数组的大小,程序在栈上为其分配了固定大小的内存空间,分配和释放的速度非常快。
所以在程序中的选择方式是根据其功能所决定的。所以静态数组的生命周期小于动态数组,如果在函数外部使用需要特殊处理为全局变量。通常情况,需要在函数外调用该内存信息选择malloc动态申请数组更好,可以根据需要随时释放内存信息。