zoukankan      html  css  js  c++  java
  • malloc函数

    使用语句:extern void *malloc(unsigned int num_bytes);

    头文件:在TC2.0中可以用malloc.h或 alloc.h (注意:alloc.h 与 malloc.h 的内容是完全一致的),而在Visual C++6.0中可以用malloc.h或者stdlib.h

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

    返回值:如果分配成功则返回指向被分配内存的指针(次存储区中的初始值不确定),否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。函数返回的指针一定要适当对齐,使其可以用于任何数据对象。

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

    名称解释:malloc的全称是memory allocation,中文叫动态内存分配,当无法知道内存具体位置的时候,想要绑定真正的内存空间,就需要用到动态的分配内存。

    函数声明:1、语法:void *malloc(size_t size);

    2、备注:void*表示未确定类型的指针,void*可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户使用这段空间来存储什么类型的数据(比如是char还是int等)

    与new的区别

    在使用上,malloc和new至少有两个不同:new返回指定类型的指针,并且可以自动计算所需大小。比如

    1 int*p;
    2 p=newint;//返回类型为int*类型(整数型指针),分配大小为sizeof(int);

    或:

    1 int*parr;
    2 parr=newint[100];
    3 //返回类型为int*类型(整数型指针),分配大小为sizeof(int)*100;

    malloc则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针

    1 int*p;
    2 p=(int*)malloc(sizeof(int)*128);
    3 //分配128个(可根据实际需要替换该数值)整型存储单元,
    4 //并将这128个连续的整型存储单元的首地址存储到指针变量p中
    5 double*pd=(double*)malloc(sizeof(double)*12);
    6 //分配12个double型存储单元,
    7 //并将首地址存储到指针变量pd中

    第一、malloc 函数返回的是 void * 类型。对于C++,如果你写成:p = malloc (sizeof(int)); 则程序无法通过编译,报错:“不能将 void* 赋值给 int * 类型变量”。所以必须通过 (int *) 来将强制转换。而对于C,没有这个要求,但为了使C程序更方便的移植到C++中来,建议养成强制转换的习惯。

    第二、函数的实参为 sizeof(int) ,用于指明一个整型数据需要的大小。
    在Linux中可以有这样:malloc(0),这是因为Linux中malloc有一个下限值16Bytes,注意malloc(-1)是禁止的;
    但是在某些系统中是不允许malloc(0)的。在规范的程序中我们有必要按照这样的格式去使用malloc及free:
    type*p;
    if(NULL==(p=(type*)malloc(sizeof(type))))
    /*请使用if来判断,这是有必要的*/
    {perror("error...");
    exit(1);}
    .../*其它代码*/
    free(p);
    p=NULL;/*请加上这句*/
    malloc 也可以达到 new [] 的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。
    比如想分配100个int类型的空间:
    1 int*p=(int*)malloc(sizeof(int)*100);
    2 //分配可以放得下100个整数的内存空间。
    另外有一点不能直接看出的区别是,malloc 只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。
    除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。
    对其做一个特例补充
    char*ptr;
    if((ptr(char*)malloc(0))==NULL)
    puts("Gotanullpointer");
    else
    puts("Gotavalidpointer");

    此时得到的是Got a valid pointer。把0赋给malloc能得到一个合法的指针

  • 相关阅读:
    sql 大数据量 的分表操作
    NHibernate 2.0 配置
    NHibernate 之调用存储过程
    k-v-o 扫盲
    320学习笔记 2
    GCD之dispatch queue
    使用KVO体会
    timer,runloop,thread,task小总结
    Run Loop
    iPh oto的删除动画
  • 原文地址:https://www.cnblogs.com/rong86/p/3704423.html
Copyright © 2011-2022 走看看