zoukankan      html  css  js  c++  java
  • C语言 ---- reallocmalloccalloc

    realloc()

    extern void *realloc(void *mem_address, unsigned int size);

    指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小)。

    头文件: <stdlib.h>

    更改已经配置的内存空间,即更改由malloc()函数分配的内存空间的大小。

    如果将分配的内存减少,realloc仅仅是改变索引的信息。

    如果是将分配的内存扩大,则有以下情况:

    1)如果当前内存段后面有需要的内存空间,则直接扩展这段内存空间,realloc()将返回原指针。

    2)如果当前内存段后面的空闲字节不够,那么就使用堆中的第一个能够满足这一要求的内存块,将目前的数据复制到新的位置,并将原来的数据块释放掉,返回新的内存块位置。

    3)如果申请失败,将返回NULL,此时,原来的指针仍然有效。
    注意:如果调用成功,不管当前内存段后面的空闲空间是否满足要求,都会释放掉原来的指针,重新返回一个指针,虽然返回的指针有可能和原来的指针一样,即不能再次释放掉原来的指针。当内存不再使用时,应使用free()函数将内存块释放。

    malloc()

    extern void *malloc(unsigned int size);

    头文件:stdlib.h。

    功能:分配长度为size字节的内存块

    返回值:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。

    说明:关于该函数的原型,在旧的版本中malloc返回的是char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。

    calloc()

    void *calloc(unsigned n,unsigned size);

    头文件:stdlib.h

    功 能: 在内存的动态存储区中分配n个长度为size的连续空间,函数返回一个指向分配起始地址的指针;如果分配不成功,返回NULL。

    跟malloc的区别:calloc在动态分配完内存后,自动初始化该内存空间为零,而malloc不初始化,里边数据是随机的垃圾数据

    calloc函数一次可以分配n块区域。

    例如: ps=(struet stu*) calloc(2,sizeof (struct stu));

    其中的sizeof(struct stu)是求stu的结构长度。

    意思是:按stu的长度分配2块连续区域,强制转换为stu类型,并把其首地址赋予指针变量ps。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 
     4 int main(void) {
     5     int n = 10;
     6     int i;
     7     long *mal = (long *)malloc(n * sizeof(long));
     8    long *cal=(long *)calloc(n,sizeof(long));
     9 
    10    for (i = 0; i < n; i++)  
    11    {
    12     printf("%d	", mal[i]);  
    13    } 
    14 
    15    for (i = 0; i < n; i++)  
    16      {   
    17     printf("%d	", cal[i]);
    18      }
    19 
    20    printf("malloc内存地址: %p
    ", mal);   
    21     for (i = 0; i < n; i++)   mal[i] = i+1;    
    22     for (i = 0; i < n; i++)   printf("%d	", mal[i]); 
    23    printf("
    
    ");    
    24 
    25   n = 4;     
    26   mal = (long *)realloc(mal, n*sizeof(long));   
    27   printf("realloc内存地址: %p
    ", mal);  
    28   for (i = 0; i < n; i++)   printf("%d	", mal[i]); 
    29     printf("
    
    ");     
    30 
    31   int num = 10;     
    32   mal= (long *)realloc(mal, num*sizeof(long));   
    33   printf("re-realloc内存地址: %p
    ", mal);   
    34   for (i = 0; i < n; i++)   printf("%d	", mal[i]);
    35 
    36    free(mal);  
    37   free(cal);  
    38   getchar();    
    39   return 0;
    40 }
  • 相关阅读:
    C# 如何定义让PropertyGrid控件显示[...]按钮,并且点击后以下拉框形式显示自定义控件编辑属性值
    “Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法
    Web服务器之iis,apache,tomcat三者之间的比较
    [转]C#如何把文件夹压缩打包然后下载
    [转]C#压缩打包文件
    C#——Marshal.StructureToPtr方法简介
    [Android Pro] 内容提供者ContentProvider的基本使用
    [Linux] awk命令详解
    [Linux] AWK命令详解(大全)
    [Android UI] ProgressBar自定义
  • 原文地址:https://www.cnblogs.com/jianhui-Ethan/p/5258458.html
Copyright © 2011-2022 走看看