动态内存分配
2023-12-18 21:57:37 # 技术

C 语言的动态内存分配

C语言使用mallocfree两个库函数完成动态内存的分配和释放,头文件为stdlib.h。其函数原型为:

1
2
void * malloc(size_t_ size);
void free(void *p);

使用实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main()
{
char* name;
name = (char *)malloc(sizeof(char) * 20);
strcpy(name, "Ap0l1o");
printf("%s", name);
free(name);
name = NULL;
}

需要注意的地方(C语言内存分配的不足之处):

  • malloc函数的参数是要分配的字节数目,这个需要我们自己来计算。比如,上面的实例中,我们先使用sizeof函数计算了char类型的内存大小,然后分配了20个char类型内存大小;
  • malloc函数的返回值是无类型指针void *,需要我们在程序中强制将其转为指定的类型。所以在上面的实例中,我们使用(char *)将其转为char类型的指针变量;
  • 特别需要注意的是free函数只是释放了malloc所申请的内存,但并没有改变指针的值,因此,在释放内存后应该将指针指向NULL,否则该指针将指向一个无法控制的内存区域,成为野指针;

C++动态内存分配

为了弥补C语言动态内存分配的缺点,C++提供了新的运算符newdelete来完成动态内存的分配和释放。
使用运算符newdelete的优点为:

  • new的参数为待分配单元的数目,它自动计算要分配的变量类型的大小;
  • 它自动返回正确的指针类型,不必对返回的指针进行类型转换;
  • 可以用new将分配的存储空间进行初始化;

使用方法为:

1
2
3
4
5
6
1.  指针变量名 = new 指针基类型名(指针基类型表达式);
圆括号里的「指针基类型表达式」意思是用这个表达式的值来初始化指针指向的单元。
例如,p = new double(1.0),将指针p指向地址的值初始化为1.0
2. 指针变量名 = new 指针基类型名[整型表达式];
方括号里的「整型表达式」是要分配一个数组,表达式的值是分配的数组的长度。
例如,p = new char[10],指针p指向长度为10的数组的第一个元素。

注意事项如下:

  • 使用new申请的存储空间是没有名字的,只能通过指针间接访问它们;
  • delete 的操作数必须是一个new返回的指针;