首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用malloc,为什么使用malloc?

何时使用malloc,为什么使用malloc?
EN

Stack Overflow用户
提问于 2012-01-10 16:40:08
回答 7查看 82.3K关注 0票数 80

嗯,我不明白什么时候以及为什么需要使用malloc来分配内存。

下面是我的代码:

代码语言:javascript
复制
#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;,为什么还需要分配内存

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-01-10 16:46:54

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

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

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

请查看手册页malloc(3)

票数 76
EN

Stack Overflow用户

发布于 2012-01-10 16:45:37

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

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

票数 39
EN

Stack Overflow用户

发布于 2012-11-28 08:07:46

稍微扩展一下示例的结构,考虑一下:

代码语言:javascript
复制
#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 = malloc(sizeof *p);

}

C a是一种隐式通过值传递的语言,而不是通过引用。在本例中,如果我们将'p‘传递给一个函数来对其执行一些工作,我们将创建整个结构的副本。这使用了额外的内存(该特定结构需要多少空间的总和),速度较慢,并且可能不能很好地伸缩(马上对此进行更多介绍)。然而,通过传递*p,我们并没有传递整个结构。我们只是在内存中传递一个引用此结构的地址。传递的数据量更小(指针大小),因此操作更快。

现在,了解了这一点,想象一下一个程序(就像学生信息系统)必须创建和管理数千甚至数万条记录。如果通过值传递整个结构,则操作一组数据所需的时间将比仅传递指向每条记录的指针要长。

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8800482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档