【发布时间】:2018-02-26 08:17:14
【问题描述】:
好吧,我是C的初学者,所以我可能还没有理解所有内容,所以我开始吧:
我们需要使用 c 编写一个没有任何 hal 库的 stm32f0。作为练习,我们需要将示例 usart 代码从顺序更改为中断驱动(对于接收部分)。现在这并不太难。另一个任务是添加一个先进先出缓冲区。 (实际分配说明我们需要使用大约 100 个字符的固定缓冲区大小)。我想实现一个动态缓冲区大小。一些谷歌搜索给了我使用指针并使用 malloc 为所需字符分配内存的答案。所以我这样做了:
volatile char *fifo_char_buffer;
void USART_init(int bufsize){
fifo_char_buffer = (char *)malloc(bufsize * sizeof *fifo_char_buffer);
//setting bunch of registers for usart1
}
//functions for writing/reading fifobuffer
在微控制器上一切正常。但我开始阅读更多关于 malloc 的内容,发现在 malloc 之后执行 free 或多或少是强制性的。
现在我的问题是:由于当前状态下的缓冲区永远不会被一次全部清除,并且会持续使用直到您真正关闭设备,我真的需要释放该指针吗?据我所知,可能有限,每次重新启动 MCU 时,它都会再次执行所有分配,对吗?
【问题讨论】:
-
只有在您不再需要该内存时才调用
free()。 -
我会非常小心 uC 上的动态分配。通常堆很小,你还需要链接很多库。如果是 uC,你应该考虑其他方式。
-
它是 C 还是 C++(不要在 C 中转换 malloc 的返回,你必须在 C++ 中转换它)?我想是 C,编辑过的标签。
-
所有要说的:在这样的系统上,根本不要使用
malloc和朋友。它通常甚至没有实现,或者可能只是一个存根。你怎么知道,因为你甚至不检查错误?如果您一直需要该缓冲区,为什么要动态分配而不使用静态数组?
标签: c arrays pointers memory-management