我正在关注学习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
。
答案 0 :(得分:3)
malloc
至少在3个场景中使用:
char
字符串。但这绝不是编程所必需的。
当然,如果没有它,很多事情将更难实现,但不是绝对必要的。事实上,某些特殊应用的编码风格(如航空电子设备的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返回空值,因此在这种情况下无法分配内存