C/C++经验技巧总结C语言

为什么要malloc()?何时要malloc()?如何使用mal

2017-12-22  本文已影响39人  XDgbh

各方评论:
malloc free 是C库函数
C++ 基本用不上
C ++ 改用new ,delete 运算符了
c++本来就不提倡使用malloc,而是用new,毕竟malloc只是内存分配,不管构造函数的调用。
当需要动态分配的空间的时候就要用到malloc了,原来的程序可能都是申请的局部变量,变量存储位置在栈上,使用malloc的变量空间在堆上,只返回空间指针,使用完成后要调用free函数。
比较常用的,动态数组(数组无法事先确定大小),链表节点内存的动态分配和释放,等等。
比如你在编译时不能确定数组的大小,需要动态分配。
再比如内存池需要管理内存,需要自行分配一片大的内存。

1.malloc是用来进行内存分配,事先不知道大小时
2.需要重新分配(增加)内存,前面最好用malloc分配,然后用realloc
3.分配较大内存时,因为栈空间有限
4.从函数返回结果时,由于生命周期的原因

函数原型:void *malloc(unsigned int num_bytes); //分配长度为num_bytes字节的内存块

为什么要?何时要?

如何使用?

  int *p;
  p = (int*)malloc(sizeof(int) * 128);
    //分配128个整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
  double *pd = (double*)malloc(sizeof(double) * 12);  
    //分配12个double型存储单元,并将首地址存储到指针变量pd中
  free(p);
  free(pd);
  p = NULL;
  pd = NULL;  
  指针用完赋值NULL是一个很好的习惯。

内存泄漏:

例1:

#include <stdio.h>
#include <malloc.h>
#define MAX 1000000
int main(void)
{
    int *a[MAX] = {NULL};
    int i;
    for(i=0;i<MAX;i++)
    {
      a[i]=(int*)malloc(MAX);  //此处没有判断返回值
    }
    return 0;
}

例2:

#include "stdio.h"
#include "malloc.h"   //malloc()函数被包含在malloc.h里面 
int main(void)
{
    char *a = NULL;//声明一个指向a的char*类型的指针         
    a = (char*)malloc(100*sizeof(char)); //使用malloc分配内存的首地址,然后赋值给a
   //如果malloc失败,可以得到一些log此处返回条件判断错误,应为:if(NULL == a)   
    if(!a)
    {
        perror("malloc");
        return -1;
    }
    sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址
    printf("%s\n",a);
    free(a);//释放掉使用的内存地址
    return 0;
}

再举个例子

LINKLIST *S;
S->data=x;
LINKLIST *S;
LINKLIST P;
S=&P;
S->data=x;
LINKLIST *s;
s=(LINKLIST*)malloc(sizeof(LINKLIST));
s->data=x;

再举一个简单的例子

//错误例子
int * i;
*i=1;  
//正确例子
int * i;
i=(int*)malloc(sizeof(int));
*i=1;    

未完待续。。。

上一篇 下一篇

猜你喜欢

热点阅读