4

我正在努力学习 c. 我知道malloc()分配的字节块在没有用户请求的情况下无法更改或损坏,但是我发现自己经常使用它。确切地说,每次我想创建一个结构或我想在将来引用的任何内容时,我都会使用 malloc。当它完成时,我也理解free()分配的内存。

我对 malloc 的使用正确吗?

4

3 回答 3

2

动态内存分配(malloc和系列)有两个原因:

  • 您的数据需要在分配它的范围之外持续存在(例如多线程)
  • 无论您分配什么,对于您的堆栈来说都太大了

您确实应该避免出于任何其他原因分配动态内存。自动(堆栈)变量更不容易出错,并在作用域结束时自动为您解除分配。

像您所说的那样,“损坏的内存”实际上只能由错误的编程引起,并且可能发生在堆栈和堆上,并且您不应依赖动态内存来提供安全性,以防止缓冲区溢出或其他导致内存损坏的错误。

C 标准库中的许多函数将指向缓冲区的指针作为参数放入其中是有原因的:它允许您在堆栈上分配这些缓冲区。例如:

 ssize_t read(int fd, void *buf, size_t count);

另一个答案也提到了:您的堆栈内存已经在 CPU 缓存中,因此可以更快地访问。

于 2013-10-07T08:40:59.587 回答
1

还请考虑其他类型的分配:

int foo;

在块之外将分配一个全局变量,该变量在进程的整个生命周期内都是活动的,并且对程序的其他模块可见。

static int foo;

块外部是相同的,但仅在实际模块中可见。

int foo;

只有在块中的代码运行时,块内才处于活动状态,然后它被销毁。

static int foo;

块内部仅在块中可见,但它在进程的整个生命周期内保留其值。

我正在做很多嵌入式 C 编码,并且绝对禁止使用 malloc()。这是完全有可能的。如果您在编译时不知道问题的大小,通常需要 malloc() 。但即使在某些情况下,您也可以用其他技术代替动态内存分配,如递归、基于行的处理等。

于 2013-10-07T05:50:57.990 回答
0

这取决于你的意思

未经用户请求无法更改或损坏

如果您指的是代码 - 那么它通常称为客户端,而不是用户。目前还不清楚你的意思是什么。但这不是重点。

关键是这malloc()是用于动态内存分配的函数之一。这意味着您可以将此函数返回的地址传递到其他地方,并且存储在那里的数据将在那里,直到它被手动释放。与超出范围时自动释放的静态内存分配不同。

因此,如果由它分配的内存在同一范围内被释放,您可能不应该使用malloc()它,只是因为它没有意义,而且因为静态分配更快,因为 CPU 更容易缓存并且它在程序启动时初始化,而不是在运行时作为堆初始化分配的内存。

于 2013-10-07T05:52:35.367 回答