malloc与realloc的区别 您所在的位置:网站首页 c语言malloc的用法 malloc与realloc的区别

malloc与realloc的区别

2023-08-16 18:06| 来源: 网络整理| 查看: 265

        ANSI C说明了三个用于存储空间动态分配的函数 (1) malloc 分配指定字节数的存储区。此存储区中的初始值不确定 (2) calloc 为指定长度的对象,分配能容纳其指定个数的存储空间。该空间中的每一位(bit)都初始化为0 (3) realloc 更改以前分配区的长度(增加或减少)。当增加长度时,可能需将以前分配区的内容移到另一个足够大的区域,而新增区域内的初始值则不确定。         分配函数时再分配 realloc() ,使我们可以增、减以前分配区的长度(最常见的用法是增加该区)。如果先分配一个可容纳长度为512的数组的空间,并在运行时填充它,但又发现空间不够,则可调用realloc扩充该存储空间。如果在该存储区后有足够的空间可供扩充,则可在原存储区位置上向高地址方向扩充,并返回传送给它的同样的指针值。如果在原存储区后没有足够的空间,则realloc分配另一个足够大的存储区,将现存的512个元素数组的内容复制到新分配的存储区。因为这种存储区可能会移动位置,所以不应当使用任何指针指在该区中。注意,realloc的最后一个参数是存储区的newsize(新长度),不是新、旧长度之差。作为一个特例,若ptr是一个空指针,则realloc的功能与malloc相同,用于分配一个指定长度newsize的存储区。

一.malloc

malloc的参数就是所需分配的字节数,malloc在c语言中不是关键字而是C函数库中提供的函数。调用malloc时就是在内存池中提取一块连续的空间,并返回这块内存的指针。代码示例:

#include #include typedef struct node { int data; struct node *next; }node; node *create(int n) { node *p = NULL, *head; head = (node*)malloc(sizeof (node )); p = head; node *s; int i = 1; if( 0 != n ) { while( i data = i++; // 为循环链表初始化,第一个结点为1,第二个结点为2。 p->next = s; p = s; } s->next = head->next; } free(head); return s->next ; } 二.realloc

void realloc(void *ptr,size_t new_size); ptr是指向原来地址的指针,这个函数用于修改一个原先已经分配内存块的大小。

使用:

1.可以使一块内存扩大或缩小(原来的内存块可以扩大缩小)

  (1.)如果是扩大一个内存块,则将原来的内存块保留在他的后边新增一块内存块(但是新增的内存块并未初始化)

  (2.)如果是缩小一块内存块,则将该内存块的后半部分直接拿掉,剩余部分内存块及其内容保留。

2.原来的内存块无法扩大缩小

   如果是着这种情况,realloc会重新开辟一个新的内存空间,并把原来的内存空间的内容拷贝到新的内存空间里。

注意:再调用完realloc后就不能使用指向就内存的指针,而是用返回的新的指针。

内存扩展如图所示。

值得一提的是:如果realloc中的第一个参数如果为空则和malloc一样。

#include #include #include #include int main() { const int size = 2000; int *p = (int *)malloc(20 * sizeof(int)); int *p1 = (int *)realloc(p, size*sizeof(int)); printf("%x\n", p); printf("%x\n", p1); system("pause"); return 0; }

--------------------- 引用:https://blog.csdn.net/alidada_blog/article/details/80607267 

https://blog.csdn.net/u010137839/article/details/78643503

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有