malloc有什么用?为什么不......不使用它?

时间:2014-02-27 23:40:04

标签: c memory memory-management malloc

我正在关注学习C的this tutorial,并说出以下内容:

  

假设我们想要动态分配人员结构。这个人的定义如下:

typedef struct {
    char * name;
    char age;
} person;
     

要在myperson参数中分配新人,我们使用以下语法:

person * myperson = malloc(sizeof(person));

为什么他们这样做? malloc带来了哪些好处?

以下代码编译并且看似完全正常:

typedef struct {
    char * name;
    char age;
} person;

person p;
p.name = "Henry";
p.age = 9;

printf("%s is %d", p.name, p.age);

我很困惑为什么我要使用malloc

5 个答案:

答案 0 :(得分:3)

malloc至少在3个场景中使用:

  1. 构建数组时,创建的元素数量不是先验或变量(尽管C99允许数组的运行时大小定义)。作为特殊情况,可变长度char字符串。
  2. 在请求非常大的内存块时,它不适合堆栈,作为全局变量的替代。
  3. 每当需要动态管理内存时,即明确而急切地分配和释放内存,以减少占用空间。
  4. 但这绝不是编程所必需的。

    当然,如果没有它,很多事情将更难实现,但不是绝对必要的。事实上,某些特殊应用的编码风格(如航空电子设备的DO-178B)实际上禁止使用它。

答案 1 :(得分:0)

Malloc让您可以灵活地动态分配内存并在需要时使用它,并在您不需要时将其释放。在上面的情况下,为人p分配的存储器将保持到堆栈的末尾。您可能在当前示例中找不到它的用法。但是在很多情况下,动态分配内存是有意义的。

答案 2 :(得分:0)

提供的示例并没有真正显示'malloc'的全部功能,就像那样简单。

想想一个你不知道最大数量的应用程序,让我们说一个银行账户......(对于这个例子,钱只是整数)

现在,您是一名程序员,因此余额可能存储在一个16位数字的两个帐户中:

unsigned int * array = malloc(2 * sizeof(unsigned int)); //This allows the array 
                                                         //to have two indexes.

现在,我们现在需要添加另一个帐户......

如果我们没有聪明地使用malloc,我们就会被填满。

但是,我们现在可以说:

realloc(3 * sizeof(unsigned int));

并添加更多银行帐户:)

答案 3 :(得分:0)

另一种看待这种情况的方法是why use a pointer to my struct rather than just the struct,因为当你想到malloc()时,你会想到指针。使用指针的一个好处是malloc(),在调用函数时会产生开销。当您的数据结构变得更加复杂时,当您将它们作为参数传递给函数时,它们的开销会增加。一种抵消这种情况的方法是只传递指向结构的指针,然后在函数中取消它。

void printfStruct(struct myStruct) 
{
    printf("%s", myStruct.name);
    // no pointer passed, overhead created on larger data structures
}

void printfStruct(struct *myStruct)
{
    printf("%s", myStruct->name);
    // pointer passed, then dereferenced. Decreased overhead on larger data structures.
}

答案 4 :(得分:0)

Malloc习惯了  在运行时分配内存。如果您不确定确切的人数,则可以在运行时确定,并为其分配合适的内存。

malloc连续分配内存...即,你可以做指针算术

当你想释放内存时,你可以给free(),这会释放整个内存块,无论大小太大或太小。

另请注意,malloc没有任何默认值,因此默认情况下它包含垃圾值...如果要将默认值设置为零,则使用calloc而不是malloc。

如果没有可用的连续空间,则malloc返回空值,因此在这种情况下无法分配内存