关于动态内存malloc和realloc
1.malloc

2.申请的内存为连续的内存空间
3.返回的地址可以根据实际需要强转成对应的类型
4.动态申请内存的生命周期是整个程序,除非手动释放
int* p = (int*)malloc(n * sizeof(int));
free(p);//此处的代码就可以针对p进行各种操作
1.如果 malloc之后没有及时的free,则内存泄漏(memory leak)
malloc的内存free一次就可以,重复free也是未定义行为
第一次申请的内存使用p进行了保存,接下来修改p的内存后,在也没法找到第一次申请内存的地址,有就无从释放。
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
//free只是释放内存,并不会把指针设为NULL
//此刻应该手动将str设为NULL,这样才不会存在隐患
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}

3.动态内存实例:
接下来我们看一下在简易通讯录里怎么实现动态内存的开辟
在通讯录中实现动态内存,也就是对一个创建一个可以自动扩容的结构体数组
我们先写一个静态的结构体类型的数组
typedef struct PersonInfo
{
//每个联系人的信息
char name[];
char sex[];
char age[];
char phone[];
char addrss[];
char company[];
}PersonInfo; typedef struct Book
{
PersonInfo person_book[];
int size;//通讯录的有效区间
}Book; Book g_person_book; //初始化
void Init(Book* person_book)
{
assert(person_book != NULL);
memset(person_book,,sizeof(Book));
}
接下来我们便可以将固定大小的 person_book [100]修改为可以自动扩容的动态。
修改的时候需要用到 malloc ,则需要将 person_book 修改为指针类型,并加入可以表示最大储存的变量。
typedef struct Book
{
PersonInfo* book;
int capacity;//元素的最大储存量
int size;//通讯录的有效区间
}Book;
其次需要修改初始化中的内容:
void Init(AddressBook* addr_book)
{
//判定传入参数是否为空
assert(addr_book != NULL);
addr_book->size = 0;
addr_book->capacity = 10;
addr_book->person_infos = (PersonInfo*)malloc(
sizeof(PersonInfo)*addr_book->capacity);
}
关于动态内存malloc和realloc的更多相关文章
- C—动态内存分配之malloc与realloc的区别
在程序的执行期间分配内存时,内存区域中的这个空间称为堆(heap).还有另一个内存区域,称为堆栈(stack),其中的空间分配给函数的参数和本地变量.在执行完该函数后,存储参数和本地变量的内存空间就会 ...
- C语言中动态内存的分配(malloc,realloc)
动态内存分配:根据需要随时开辟,随时释放的内存分配方式.分配时机和释放时机完全由程序员决定,由于没有数据声明,这部分空间没有名字.无法像使用变量或数组那样通过变量名或数组名引用其中的数据,只能通过指针 ...
- 内存动态分配之realloc(),malloc(),calloc()与new运算符
1,malloc与free是C/C++的标准库函数,new/delete是C++的运算符,是C++面向对象的特征,它们都可用于申请动态内存和释放内存.2,对于非内部数据类型的对象而言,光用maloc/ ...
- 内存分配函数malloc、realloc、calloc、_alloca
1.内存分配函数_alloca.malloc.realloc.calloc: _alloca 函数原型void * __cdecl _alloca(size_t); 头文件:malloc.h _all ...
- 动态内存管理详解:malloc/free/new/delete/brk/mmap
c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, calloc/realloc 上述8个函数/操作符是c/c++语言里常用来做动 ...
- 内存分配机制malloc&&alloca&&realloc
<1>从静态存储区域分配. 内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量.static变量.<2>在栈上创建 在执 ...
- 动态内存管理:malloc/free/new/delete/brk/mmap
这是我去腾讯面试的时候遇到的一个问题——malloc()是如何申请内存的? c++ 内存获取和释放 new/delete,new[]/delete[] c 内存获取和释放 malloc/free, c ...
- malloc函数 链表 运行时才知道内存 动态内存
https://baike.baidu.com/item/malloc函数 malloc的全称是memory allocation,中文叫动态内存分配,用于申请一块连续的指定大小的内存块区域以void ...
- 转: Linux C 动态内存分配 malloc及相关内容 .
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
随机推荐
- vue--使用vue-cli构建项目
webpack是现在较流行的前端自动化工具,该工具可以帮助开发者打包代码,以减少需要手动的工作,可以提高开发效率. vue中提供了一个脚手架工具vue-cli,这个工具已经将webpack配置好了,使 ...
- layui框架
layui框架 Fly社区/分享一个layui风格的grid.greegrid
- QT编程环境
(1)QT的工具 ① assistant 帮助手册 ② qmake -v 查看qt版本 ③ qmake -project 可以把项目的源文件组织成项目的描述文件 .pro ④ qmake 可以根据.p ...
- 整数转罗马数字以及罗马数字转整数(java实现)
题目: 1.罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 写做 II ...
- MySQL存储过程入门
MySQL存储过程入门 在本教程中,我们将逐步介绍如何使用CREATE PROCEDURE语句开发第一个MySQL存储过程. 另外,我们将向您展示如何从SQL语句调用存储过程. 编写第一个MySQL存 ...
- 『TensorFlow』读书笔记_降噪自编码器
『TensorFlow』降噪自编码器设计 之前学习过的代码,又敲了一遍,新的收获也还是有的,因为这次注释写的比较详尽,所以再次记录一下,具体的相关知识查阅之前写的文章即可(见上面链接). # Aut ...
- mongoengine 分页 切片与 skip + limit 的区别
首先要了解切片与 skip 的原理 切片原理是将 index(索引) 或 cursor(游标)移动到 start 位置再 进行切分: skip原理是跳过start条数据后再获取 1. 单纯的普通分页用 ...
- javascript中NAN undefined 和null
null 表示无值,而 undefined 表示一个未声明的变量,或已声明但没有赋值的变量,或一个并不存在的对象属性. NaN 属性是代表非数字值的特殊值.该属性用于指示某个值不是数字.可以把 Num ...
- 兼容 Spring Boot 1.x 和 2.x 配置类参数绑定的工具类 SpringBootBindUtil
为了让我提供的通用 Mapper 的 boot-starter 同时兼容 Spring Boot 1.x 和 2.x,增加了这么一个工具类. 在 Spring Boot 中,能够直接注入 XXProp ...
- Mysql 编译安装脚本
cat mysql_init.sh##安装mariadb依赖包function install_yum(){ yum -y install $1}i="ncurses* bison gcc ...