动态开辟内存
平时在程序中的普通变量是开辟在栈区,如果程序过大,所有的普通变量都开辟在栈区,栈区内存会不足,内存溢出,程序出错。所以要将一些比较大的开销放在堆区。堆区由我们手动开辟,手动释放。不同于栈区,定义变量就自动开辟,变量生命周期结束会自动释放。下面看看如何在堆区手动开辟内存
malloc
函数介绍
<stdlib.h> //头文件
void *malloc( size_t size );
形参 size 开辟的内存块大小
返回类型 void * 万能指针类型
//动态开辟内存
//在堆区开辟4个字节内存
int *ptr = NULL;
ptr = (int*)malloc(sizeof(int));
//也可以写成
//ptr = malloc(sizeof(int))
//最好强制类型转换一下
操作堆区的内存与在栈区的操作一样,ptr已经拿到地址,就可以指针法操作内存。
*ptr = 10;
手动开辟内存后,需要手动释放内存
void free( void *ptr );
形参为区地址,无返回值。
//手动释放内存
free(ptr);
动态开辟内存(malloc),告诉系统该内存块有人使用,不允许再次动态开辟内存,来使用这块内存块。手动释放(free)后,该指针与此内存块没有联系,允许动态开辟内存使用该内存块。禁止手动释放同一块内存两次,禁止手动释放内存后,再次操作该内存。这样会导致运行出错,这是因为操作非法内存。避免这种情况的出现,再手动释放内存后,讲该指针置为NULL;
ptr = NULL;
realloc
<stdlib.h>
void *realloc( void *ptr, size_t size );
功能: 函数将ptr 对象的储存空间改变为给定的大小size。 参数size可以是任意大小,大于或小于原尺寸都可以。 返回值是指向新空间的指针,如果错误发生返回NULL。
这个函数的使用需要先在堆区开辟内存,然后使用该函数动态修改操作的内存块大小。
int *ptr = NULL;
ptr = (int*)malloc(4);
realloc(ptr,8);
printf("ptr: %u\n",ptr);
realloc(ptr,4);
printf("ptr: %u\n",ptr);
结果展示
ptr: 10297496
ptr: 10297496
动态改变内存大小,指针指向的内存首地址不变。这个就可以用于动态数组。
注意事项
动态开辟内存,不需要后及时手动释放,并把指针指向空,养成良好的编程习惯。realloc会有一些坑,尽量使用malloc。
文章结束
网友评论