1.malloc
1.申请的内存长度可以运行时决定,单位是字节
2.申请的内存为连续的内存空间
3.返回的地址可以根据实际需要强转成对应的类型
4.动态申请内存的生命周期是整个程序,除非手动释放
2.申请的内存为连续的内存空间
3.返回的地址可以根据实际需要强转成对应的类型
4.动态申请内存的生命周期是整个程序,除非手动释放
此时就动态的申请了 100 * 4 长度的内存作为一个整形数组
int n = 100;
int* p = (int*)malloc(n * sizeof(int));
free(p);//此处的代码就可以针对p进行各种操作
注意:
1.如果 malloc之后没有及时的free,则内存泄漏(memory leak)
malloc的内存free一次就可以,重复free也是未定义行为
1.如果 malloc之后没有及时的free,则内存泄漏(memory leak)
malloc的内存free一次就可以,重复free也是未定义行为
如果申请了两次malloc但是free一次情况:
第一次申请的内存使用p进行了保存,接下来修改p的内存后,在也没法找到第一次申请内存的地址,有就无从释放。
第一次申请的内存使用p进行了保存,接下来修改p的内存后,在也没法找到第一次申请内存的地址,有就无从释放。
2.free只是将内存释放,并不会设为NULL
void Text()
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
//free只是释放内存,并不会把指针设为NULL
//此刻应该手动将str设为NULL,这样才不会存在隐患
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
{
char* str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
//free只是释放内存,并不会把指针设为NULL
//此刻应该手动将str设为NULL,这样才不会存在隐患
if (str != NULL)
{
strcpy(str, "world");
printf(str);
}
}
2.realloc
![](https://i-blog.csdnimg.cn/blog_migrate/9ec6589fbdb9bc755f6e6a902e991bbb.jpeg)
用 realloc 扩容后的空间不一定时原来的空间,如果原来的空间内存之后还有多余的空间可以支持扩容,则会在原有的内存
空间上进行扩容,如果空间大小不足,则会在重新取一块更大的空间,然后将原来的数据拷贝上去,在释放旧的空间。
3.动态内存实例:
接下来我们看一下在简易通讯录里怎么实现动态内存的开辟
在通讯录中实现动态内存,也就是对一个创建一个可以自动扩容的结构体数组
我们先写一个静态的结构体类型的数组
1 typedef struct PersonInfo 2 { 3 //每个联系人的信息 4 char name[1024]; 5 char sex[1024]; 6 char age[1024]; 7 char phone[1024]; 8 char addrss[1024]; 9 char company[1024]; 10 }PersonInfo; 11 12 typedef struct Book 13 { 14 PersonInfo person_book[100]; 15 int size;//通讯录的有效区间 16 }Book; 17 18 Book g_person_book; 19 20 //初始化 21 void Init(Book* person_book) 22 { 23 assert(person_book != NULL); 24 memset(person_book,0,sizeof(Book)); 25
}
接下来我们便可以将固定大小的 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);
}