为什么要用malloc - 何时以及为何使用malloc?




malloc作用 (4)

malloc =内存分配。

如果您使用过其他编程语言,则可能使用了“new”关键字。

Malloc在C中执行完全相同的操作。它需要一个参数,需要分配多大的内存,并返回指向第一个内存块的指针变量。

您在内存中创建的整个内存块。 示例 -

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

现在,* p将指向存储器上保留的连续20整数块的第一个块。

您可以使用++和 - 运算符遍历每个块。 祝一切顺利。

好吧,我无法理解何时以及为什么需要使用malloc来分配内存。

这是我的代码:

#include <stdlib.h>

int main(int argc, const char *argv[]) {

  typedef struct {
    char *name;
    char *sex;
    int age;
  } student;


  //Now I can do two things
  student p;

  //or
  student *ptr = (student *)malloc(sizeof(student));

  return 0;
}

当我可以使用student p;时,为什么需要分配内存student p;


malloc用于动态内存分配。 如上所述,它是动态分配,这意味着您在运行时分配内存。 例如,当您在编译期间不知道内存量时。

一个例子应该清楚这一点。 说你知道最多会有20名学生。 因此,您可以创建一个包含静态20个元素的数组。 您的阵列最多可容纳20名学生。 但是,如果你不知道学生人数怎么办? 说第一个输入是学生人数。 它可能是10,20,50或其他任何东西。 现在,您将在运行时输入n =学生数,并使用malloc动态分配大量内存。

这只是一个例子。 在许多情况下需要动态分配。

看一下手册页malloc(3)


当您需要分配在当前块执行的生命周期之外必须存在的对象时(如果返回的复制也很昂贵),或者如果您需要分配大于该堆栈大小的内存,则使用malloc (即:一个3mb的本地堆栈数组是一个主意)。

在C99引入VLA之前,您还需要它来执行动态大小的数组的分配,但是,它需要用于创建许多系统使用的树,列表和队列等动态数据结构。 可能还有更多原因,这些只是少数几个。


稍微扩展一下这个例子的结构,考虑一下:

#include <stdio.h>

int main(int argc, const char *argv[]) {

typedef struct {
 char* name;
 char* sex;
 char* insurace;
 int age;
 int yearInSchool;
 float tuitionDue;
}student;


//Now I can do two things
student p;

//or
student *p = (student *)malloc(sizeof(student));

return 0
}

C a是通过值隐式传递的语言,而不是通过引用传递的语言。 在这个例子中,如果我们将'p'传递给函数来对它做一些工作,我们将创建整个结构的副本。 这使用额外的内存(特定结构需要多少空间),速度较慢,并且可能无法很好地扩展(在一分钟内更多)。 但是,通过传递* p,我们不会传递整个结构。 我们只在内存中传递一个引用此结构的地址。 传递的数据量较小(指针大小),因此操作更快。

现在,了解这一点,想象一个程序(如学生信息系统),它必须创建和管理数千甚至数万的记录集。 如果按值传递整个结构,则对一组数据进行操作所需的时间比将指针传递给每个记录要花费的时间要长。





dynamic-memory-allocation