zoukankan      html  css  js  c++  java
  • C语言 malloc()、memcpy()、free()等

    1、malloc()函数:

     void *malloc(unsigned int num_bytes);

    头文件:#include <malloc.h> 或 #include <alloc.h> (注意:alloc.h 与 malloc.h 的内容是完全一致的。)

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

    说明:如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。

    当内存不再使用时,应使用free()函数将内存块释放。

    malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的,申请的内存是连续的

    返回类型是 void* 类型。void* 表示未确定类型的指针。C,C++规定,void* 类型可以强制转换为任何其它类型的指针。

    malloc 函数返回的是 void * 类型,C++:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。 
    C是能通过编译,不会报错。

    规范的程序:   (检查返回值是否不是NULL,不检查若申请分配失败便造成内存泄漏

    type *p;
    if(NULL == (p = (type*)malloc(sizeof(type))))   
    /*请使用if来判断,这是有必要的*/
    {
        perror("error...");  // 内存分配失败
        exit(1);
    }
    .../*其它代码*/
    free(p);
    p = NULL;/*请加上这句*/

    分配100个int类型的空间:

    int *p = (int*)malloc(sizeof(int) * 100);

    malloc 和 new (C++关键字)至少有两个不同:

    new 返回指定类型的指针,并且可以自动计算所需要大小。

    int *parr;
    parr = new int[100];
    //返回类型为int *类型(整数型指针),分配大小为sizeof(int) * 100;
    
    int *p;
    p = new int;
    //返回类型为int *类型(整数型指针),分配大小为sizeof(int); 会自动计算int大小

    工作机制:

    malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后,将该内存块一分为二(一块的大小与用户请求的大小相等,另一块的大小就是剩下的字节)。接下来,将分配给用户的那块内存传给用户,并将剩下的那块(如果有的话)返回到连接表上。调用free函数时,它将用户释放的内存块连接到空闲链上。到最后,空闲链会被切成很多的小内存片段,如果这时用户申请一个大的内存片段,那么空闲链上可能没有可以满足用户要求的片段了。于是,malloc函数请求延时,并开始在空闲链上翻箱倒柜地检查各内存片段,对它们进行整理,将相邻的小空闲块合并成较大的内存块。如果无法获得符合要求的内存块,malloc函数会返回NULL指针,因此在调用malloc动态申请内存块时,一定要进行返回值的判断。

    2 memcpy()函数:

    功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中

     void *memcpy(void *dest, const void *src, size_t n);

    函数返回指向dest的指针。

    strcpy和memcpy主要有以下3方面的区别:
    1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
    2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符""才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
    3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
  • 相关阅读:
    1.4.2.3. SETUP(Core Data 应用程序实践指南)
    1.4.2.2. PATHS(Core Data 应用程序实践指南)
    1.4.2.1. FILES(Core Data 应用程序实践指南)
    1.4.2. 实现 Core Data Helper 类(Core Data 应用程序实践指南)
    1.4.1. Core Data Helper 简介(Core Data 应用程序实践指南)
    1.4. 为现有的应用程序添加 Core Data 支持(Core Data 应用程序实践指南)
    1.3.2. App Icon 和 Launch Image(Core Data 应用程序实践指南)
    1.3.1. 新建Xcode项目并设置故事板(Core Data 应用程序实践指南)
    php验证邮箱是否合法
    如何使js函数异步执行
  • 原文地址:https://www.cnblogs.com/fyp7077/p/7666309.html
Copyright © 2011-2022 走看看