zoukankan      html  css  js  c++  java
  • malloc与realloc的区别

    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 <stdio.h>
    #include <stdlib.h>
     
    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 <= n )
    		{
    			s = (node *)malloc(sizeof (node));
    			s->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<Windows.h>
    #include<stdio.h>
    #include<malloc.h>
    #include<stdlib.h>
     
    int main()
    {
    	const int size = 2000;
    	int *p = (int *)malloc(20 * sizeof(int));
    	int *p1 = (int *)realloc(p, size*sizeof(int));
    	
    	printf("%x
    ", p);
    	printf("%x
    ", p1);
    	system("pause");
    	return 0;
    }
    

    本文来自博客园,作者:Mr-xxx,转载请注明原文链接:https://www.cnblogs.com/MrLiuZF/p/13950498.html

  • 相关阅读:
    基于Yarp实现内网http穿透
    让Github畅通无阻,FastGithub1.0.0发布
    Pipeline模式与Factory+Provider模式的应用
    开源FastGithub
    开源Influxdb2高性能客户端
    开源AwaitableCompletionSource,用于取代TaskCompletionSource
    SourceGenerator入门指北
    dotnet高性能buffer
    CURL用法
    Nginx的进程管理与重载原理
  • 原文地址:https://www.cnblogs.com/MrLiuZF/p/13950498.html
Copyright © 2011-2022 走看看