关于动态内存malloc和realloc

1.malloc

    1.申请的内存长度可以运行时决定,单位是字节
   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也是未定义行为
   如果申请了两次malloc但是free一次情况:
     第一次申请的内存使用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);
     }
  }
 
2.realloc
 
用 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);
}

 

转载于:https://www.cnblogs.com/cuckoo-/p/10549070.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mallocrealloc是C语言中用于动态内存分配的函数。 malloc函数用于分配指定大小的内存空间,并返回一个指向该内存空间的指针。它的原型如下: void* malloc(size_t size); realloc函数用于重新分配已经分配的内存空间的大小。它接受两个参数,第一个参数是指向已经分配内存的指针,第二个参数是新的内存大小。如果新的内存大小大于原来分配的大小,那么realloc会扩大内存空间;如果新的内存大小小于原来分配的大小,那么realloc会缩小内存空间。它的原型如下: void* realloc(void* ptr, size_t size); 与calloc函数相比,mallocrealloc不会对分配的内存进行初始化,而是返回一块未初始化的内存空间。而calloc函数在分配内存之前会将每个字节初始化为0。因此,在使用mallocrealloc分配的内存空间之前,我们需要手动对其进行初始化。 下面是一个使用mallocrealloc的示例代码: ```c #include <stdio.h> #include <stdlib.h> int main() { int* p1 = malloc(10 * sizeof(int)); if (p1 != NULL) { // 使用空间 } int* p2 = realloc(p1, 20 * sizeof(int)); if (p2 != NULL) { // 使用空间 } free(p2); p2 = NULL; return 0; } ``` 在这个示例中,首先使用malloc函数分配了一块大小为10个int类型的内存空间,然后使用realloc函数将其扩大为20个int类型的内存空间。最后,使用free函数释放了已经分配的内存空间。 总结起来,mallocrealloc函数用于动态分配内存空间,而calloc函数在分配内存之前会将每个字节初始化为0。根据具体的需求,选择合适的函数来进行内存分配。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值