精华内容
下载资源
问答
  • 返回值是void指针,void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型),可以通过类型...

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

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

    返回值是void指针,void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型),可以通过类型强制转化转化为其他任意类型指针。如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。

    为什么要?何时要?

    malloc()是动态内存分配函数,用来向系统请求分配内存空间。当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数。因为malloc只管分配内存空间,并不能对分配的空间进行初始化,所以申请到的内存中的值是随机的,经常会使用memset()进行置0操作后再使用。

    与其配套的是free(),当申请到的空间不再使用时,要用free()函数将内存空间释放掉,这样可以提高资源利用率,最重要的是----就是因为它可以申请内存空间,然后根据需要进行释放,才被称为“动态内存分配”!

    malloc()函数实质体现在,它有一个可以将可用内存块连接成一个长长的列表的链表,这个链表就是所谓的空闲链表。调用malloc()函数时,它沿着连接表寻找一个大到可以满足用户请求要求的连续的内存块,然后将内存块一分为二,一块的大小与用户请求的内存大小相等,另一块就是剩下的内存块。接下来,它将用户申请的那块传递给用户,将另一块返回到连接表上(如果另一块有的话)。

    调用free()函数的时候,它将用户想要释放的内存块链接到空闲链上。我们可以想到,最后的空闲链链接的内存空间一小块一块的块,如果这是用户申请分配一个较大的内存空间,那么空闲链上可能没有符合用户要求的内存块了,这个时候,malloc()函数请求延时,并开始在空闲链上翻箱倒柜的检查各内存块,对他们进行整理,将相邻的小内存块合并成较大的内存块。如果无法获得符合用于要求的内存空间,那么malloc()函数就会返回NULL,因此,调用malloc()函数的时候,一定要判断它的返回值是否为NULL。

    如何使用?

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

    内存泄漏:
    例:  
    #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;
    }

    例:
    #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
    
    if(!a)//如果malloc失败,可以得到一些log,  此处返回条件判断错误,应为:if(NULL == a)
         
    {
        perror("malloc");
        return -1;
    }
    
    sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址
     
    printf("%s\n",a);
     
    free(a);//释放掉使用的内存地址
    
    return 0;
    

    }

    展开全文
  • 3,malloc申请空间的类型必须和指向他的指针类型匹配;such as: int *p; p=(int *)malloc(sizeof(所要存储数据的类型)); free(p); //这里要注意的是第三点中所说的类型匹配指的是指针p的int类型和malloc...

    一:malloc申请动态空间注意以下事项:

    1,malloc申请动态空间时必须声明类型;

    2,使用malloc申请的空间在使用完成之后必须使用free释放;

    3,malloc申请空间的类型必须和指向他的指针类型匹配;such as:

       int *p;
    
                p=(int *)malloc(sizeof(所要存储数据的类型));
    
                free(p);
    

    //在这里要注意的是在第三点中所说的类型匹配指的是指针p的int类型和malloc前面的int 类型匹配,与sizeof括号里的无关;
    二:链表的创建

    我们来创建一个链表用来存储5个从键盘输入的整数;

    先来了解什么是节点:在链表中我们把申请的一个动态空间称之为节点,每一个节点分为两个域,数据域和指针域,数据域用来存贮你要存的数据,指针域用来存储下一个节点的地址;

    1,我们首先使用结构体将节点的两个域分别定义出来;

    typedef struct node{

    int date;                            //用来存储整数的数据域
    
    struct node *next;              //这里定义了一个指向结构体的结构体指针,即节点的指针域;
    

    }Elemsn; //为了方便书写的方便我们为结构体起一个别名,Elemsn,等价于struct node;

    2,申请动态空间作为节点,可以理解为链表的"一个"环;并用一个指针指向他,当然类型匹配指针的类型也要为结构体类型指针;

    Elemsn *p;
    
    p=(Elemsn *)malloc(sizeof(Elemsn));//申请的空间大小为sizeof(Elemsn);
    

    3,准备工作做完,我们开始建链表;

    我们使用函数的调用完成链表的建立

    #includestdio.h
    
    #includestdlib.h
    
    #define N 5
    
    #define null 0                                    //方便书写,我们声明null=0;
    
    Elemsn *Creatlink(int a[]);            //声明函数,该函数为创建链表的函数
    
    void Printlink(Elemsn *h);            //声明函数,该函数为输出链表的函数
    
    int main(void)    //   主函数
    
    {
    
    int a[N];                //   定义整形数组a用来存放从键盘输入的5个值
    
    int i;
    
    for(i=0;
    
       scanf("%d",a+i);                //从键盘输入5个值
    
    Elemsn *head=null;                /*在主函数中定义指向链表头部的指针,我们称为头指针,领他的指针域为空*/
    
    head=Creatlink(a);         /*调用函数,函数将返回已创建好的链表,我们只需用在主函数中定义好的头指针将他指住,这样我们的链表也就建好了;这里我们将要存入链表中的数组传到形参中去,所以我们将数组第一个单元的首地址传过去*/
    
    Printlink(head);            //将整个链表传过去,调用输出函数将链表存的值输出
    
    free(head);            //free释放
    
    return 0;
    
    }
    

    Elemsn *Creatlink(int a[]) //用指针a来接数组的地址,开始创建链表

    {

    Elemsn *head,*tail,*p;            /*定义指向链表头部的头指针和指向尾部的tail指针,以及创建节点的指针p*/
    
    int i;
    
    head=tail=(Elemsn *)malloc(sizeof(Elemsn));//刚开始的时候头和尾在同一个节点上
    
    head->date=a[0];                        //令头节点的数据域存a[0];
    
    head->next=null;                        //因为此时还没有创建下一个节点,所以头指针指针域为空,没有指向;
    
    for(i=1;in;i++)        
    
    {
    
        p=(Elemsn *)malloc(sizeof(Elemsn));
    
        p->date=a[i];
    
        p->next=null;        //这里同上为创建节点并给   ‘域’  赋值
    
        tail->next=p;       // 这里很重要,此处令尾部指针  tail  所指向节点的指针域保存所创节点的地址,即为挂链
    
    
    
        tail=p;    //然后将尾部指针后移,移到p的位置,此时tail与p都指向所创的节点,然后反复循环创建节点,挂链,后移直到循环结束,此时最后一个节点的指针域为空,即为null
    
    }
    
    return head;        //返回头指针所保存的地址,指针释放,主函数中用已经定义好的head指针去接收返回的地址就好了;
    

    }

    void Printlink(Elemsn *h) //用指针h来接受链表,指向链表头部

    {

    Elemsn *p;
    
    for(p=h;p!=null;p=p->next)
    
        printf("%d\t",p->date);
    

    }

    展开全文
  • malloc空间申请

    2021-03-17 08:39:46
    void *malloc(size_t size);...注:当自己用malloc申请空间不够用的时候,使用realloc继续扩容空间的时候最好先定义一个中间变量,把新申请下来的指针返回给这个中间变量,判断这个变量不是NULL后再赋值给原来的

    void *malloc(size_t size);//在堆空间中开辟空间
    size: 字节数
    返回值: 万能指针 成功返回指针,失败返回NULL
    void *realloc(void *ptr, size_t size); //重新申请size字节空间
    ptr : 原来的空间
    返回值: 成功返回指针,失败返回NULL
    注:当自己用malloc申请的空间不够用的时候,在使用realloc继续扩容空间的时候最好先定义一个中间变量,把新申请下来的指针返回给这个中间变量,判断这个变量不是NULL后再赋值给原来的空间,以防因为申请失败而导致原来的空间数据被覆盖掉

    展开全文
  • c语言中malloc申请空间和直接定义变量申请的空间有什么区别? 1. malloc事先分配好了内存空间。 要点有三点:一是空间分配的连续性;二是动态内存申请;三是防止程序执行中出现异常错误。 如果用数组定义:...

    c语言中malloc申请的空间和直接定义变量申请的空间有什么区别?


    1. malloc事先分配好了内存空间。

    要点有三点:一是空间分配的连续性;二是动态内存申请;三是防止程序执行中出现异常错误。

    如果用数组定义:charp[64000],表示的是声明了一个数组,此数组的大小64000个字节。但是,请注意要点:系统这时并没有为其分配内存。只是在使用时才分配。

    对于p[64000]这种写法,如果系统没有足够多的内存使用,那么p[lp]所指向的,可能就是一个其它变量了,或者说p[lp]把其它变量空间覆盖了。这样最容易出现bug。

    2. 生命周期
        有些变量,存在存在与多个函数或多个线程,那么局部变量不能满足使用,但到一定阶段这个变量又不需要了,那么就要释放,所以全局变量也不适合,那么使用malloc申请内存最为适合。申请和释放比较灵活。

    3. 可以申请一大段连续内存。
        这一段大内存,可以存储复杂结构体,可以灵活存储各种类型。自己手动分配,灵活指定数据偏移等等。

     “
    malloc  之后的空间 也要初始化为 0,可能会有垃圾,使用memset。
    在虚拟机上就出现了,长期调试,不关机,会发现有问题,内存里有垃圾。”

    本人调试时发现的。

    展开全文
  • char *ptr =(char*)malloc(0); if(ptr ==NULL) { cout<< "得到NULL指针" <...注:创建指针时用到malloc就算分配内存为0,只要内存足够,系统会自动随机分配空间的。可以创建成功! ...
  • 利用二重指针,注意malloc以及memset要for内进行,因为malloc返回为一重指针地址 char **obj; obj = (char **)malloc(sizeof(char *) *numRows); for(int i=0;i<numRows;i++){ obj[i]=(char *)malloc...
  • 测试ok,代码如下: ... * 功能:malloc申请空间函数的两种返回方法 * 作者:lml 时间:2020年4月16日 12:25 ******************************************/ #include <stdio.h> #include <s...
  • str = (char*)malloc(len+1); //memset(strp,0,lenP+1); strcat(strp,str);//由于cat实在strp后面追加,不初始化str每个空间就分配了随机值相当于有内容那么就会越界添加字符串最终由于没有0字符串结尾符而乱码或段...
  • c中malloc申请空间 void test22() { int *pr; pr = (int *)malloc(sizeof(int)*128);//申请128个int4字节空间 if (pr == NULL) {//判断是否申请成功 return; } memset(pr,0,...
  • 例如此时: int init(struct Node**head ) //结构体指针 初始化 { struct Node *newnode = (struct Node *)malloc(sizeof(struct Node));...如果定义一个结构体类型的普通变量,可以不malloc动态申请内存,CPU会
  • 最近有个案子(MCU:STM32F103VCT6)需要定制个小功能,需要用malloc分配大量的空间。本来是没什么,但是无意中发现,KEIL MDK编译时,malloc分配的空间已经超过预设的大小也不报错。后面发现和自己的使用也有关系。...
  • malloc函数内存什么地方申请空间

    千次阅读 2019-07-27 23:46:41
    https://zhidao.baidu.com/question/477779079.html 内存分为堆区,栈区,静态区,代码区。 全局变量和静态变量存放静态区,局部变量存在栈区,动态申请的变量(即new,malloc函数申请的变量)存放堆区。 ...
  • malloc申请内存空间失败

    千次阅读 2016-03-31 11:45:06
    都提到失败的原因可能是因为之前申请的内存空间出现越界操作,致使malloc分配失败,自己得到了一些启示,回头查看了最近一次malloc申请内存成功后的一些操作,最后调试发现就是最近一次申请的内存空间不足,...
  • C语言子函数中调用malloc申请内存的方法【转】

    千次阅读 多人点赞 2018-08-26 14:57:46
    (转自:... 版权声明:本文为博主原创文章,未经博主允许不得转载。... 解决方法 1.函数返回  将malloc得到的内存首地址通过函数的返回值返回到主函数。 #...
  • malloc申请内存问题

    千次阅读 2019-09-17 20:26:39
    具体问题是这样的,首先malloc申请一块内存,但使用时比实际的大一个字节,比如我申请了52个字节,使用了53个或者申请50个使用了51个,然后我发现的现象是当我申请了52个字节使用了53个字节的时候,程序肯定会挂掉,...
  • malloc()到底如何申请内存空间

    千次阅读 2018-07-24 10:49:32
    当操作系统收到程序的申请时,就会遍历该链表,然后就寻找第一个空间大于所申请空间的堆结点,然后就将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。  malloc函数的实质体现,它有一个将可用的内存...
  • //malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针 if(ptr==NULL)//如果调用失败将返回一个NULL指针 { printf("分配内存失败!\n"); exit(1);//退出程序 } printf("请
  • 定义变量得到的内存,它被定义的作用域结束之后(一般就是定义语句所在的大括号),就会被释放,而malloc得到内存可以存活到被free的时间 例如 int *f() { int n = 10; return &n; } int *g() { in.
  • 手把手教你如何用malloc申请动态内存一点儿小故事为什么要申请动态内存?申请一维动态内存(连续的)动态申请二维数组(连续的)示例例题拓展 一点儿小故事 你有没有像我一样曾经这样申请内存: int **a=(int **)...
  • 探秘malloc是如何申请内存的

    千次阅读 多人点赞 2020-04-28 10:49:26
    我们都清楚malloc申请的内存不是立刻就建立虚拟地址和物理地址的映射的,当int *p = malloc(100*1024)执行这条指令之后,只是用户空间给程序开辟一段100K左右的大小,然后就返回这段空间的首地址给程序员。...
  • malloc申请堆内存

    2020-11-09 12:39:57
    1.malloc申请空间,是否记录空间大小?若是记录,那所记录的空间大小哪呢?为什么利用free释放不需要空间大小参数呢? 2.malloc函数的相关堆分配算法 3.malloc申请失败,即可使用的内存满时应该怎么办? ...
  • C语言中用于动态申请内存空间的函数主要为malloc()函数,calloc()函数,以及realloc()函数,以下主要介绍三个函数的用法,区别以及使用时的注意事项。 malloc(),calloc(),realloc()三个函数均为C语言系统库函数...
  • malloc都动态申请内存

    2019-05-15 11:03:27
    没有时间写完,以后有时间把后面的补充上 专题: 动态内存的分配 传统数组的缺点: 1、数组的长度必须事先制定,且只能是常数,不能是变量。 例如:int a[5]; int len = 5; int a[len]; 2、传统形式定义的...
  • malloc: void *malloc(size_t size );//原型 malloc分配堆区,需要free ...malloc分配空间没有默认初始化值 ...malloc申请空间失败返回NULL #include<stdlib.h>//或者<malloc.h> #include&...
  • malloc申请最大运行内存

    千次阅读 2018-11-17 20:06:27
    贴一个Windows平台下,关于malloc申请最大运行内存的代码,运行很费时间,可能是一个byte去读,效率比较低吧。 #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; unsigned maximum = 0; int...
  •  *str = (char *)malloc(20);  strncpy(*str, a, 20); }   char* test2() {  char a[] = {"hello world!"};  char *str = NULL;  str = (char *)malloc(20);  strncpy(str, a, 20);  return str; }   void ...
  • 一般来说以上两个步骤就可以正常使用malloc函数申请空间了,但前提是申请的堆空间不能超过启动文件中规定的堆空间大小(Heap_Size),以下用STM32F103ZET6的启动文件说明: variables = (int32_t *) malloc(=0x3F4);...
  • 1,有这么一个问题,下面这段程序执行完毕后,malloc的内存会释放吗? int main () { int *p = malloc(10 * sizeof *p); ... 这段程序运行完后,p 申请malloc地址会被释放掉吗? 会的。 T...
  • C语言中的malloc申请内存失败的原因

    千次阅读 2019-04-11 16:26:40
    今天写C语言的时候,发现一个malloc函数的返回值总是NULL,无法申请内存,导致异常:读取位置时候发生访问冲突。 查询了很多解决方法,此归纳一下malloc函数无法分配内存的原因: 内存不足(个人认为目前的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 84,632
精华内容 33,852
关键字:

malloc申请的空间在哪里