来自Contiki 的 github Wiki
以下是如何使用托管内存分配器的示例:
#include "contiki.h"
#include "lib/mmem.h"
static struct mmem mmem;
static void
test_mmem(void)
{
struct my_struct {
int a;
} my_data, *my_data_ptr;
if(mmem_alloc(&mmem, sizeof(my_data)) == 0) {
printf("memory allocation failed\n");
} else {
printf("memory allocation succeeded\n");
my_data.a = 0xaa;
memcpy(MMEM_PTR(&mmem), &my_data, sizeof(my_data));
/* The cast below is safe only if the struct is packed */
my_data_ptr = (struct my_struct *)MMEM_PTR(&mmem);
printf("Value a equals 0x%x\n", my_data_ptr->a);
mmem_free(&mmem);
}
}
上面的示例显示了如何使用托管内存库的基本示例。在第 4 行,我们分配了一个变量 mmem,它标识了我们将要分配的托管内存对象。在第 13 行,我们使用 mmem 变量作为 mmem_alloc() 的参数来为 sizeof(my_data) 字节的结构分配空间。如果分配成功,我们将现有结构中的值复制到分配的结构中,由 MMEM_PTR(&mmem) 指向。然后可以通过 MMEM_PTR(&mmem) 到 struct my_struct * 的类型转换访问已分配结构的各个成员,如第 20 行所示。请注意,只有在打包结构时,转换才是安全的。托管内存最终在第 21 行通过调用 mmem_free() 释放。
.
编辑:
从您粘贴在评论中的代码来看,不需要使用malloc
或mmem
-module。只需在堆栈上分配。也许尝试这样的事情:
/* Allocate memory on the stack */
char sent[120];
/* Manipulate strings */
strncpy(sent , "reqid" , 5);
strncat(sent, "|", 1);
/* Send UDP packet */
uip_udp_packet_send(mcast_conn, sent, strlen(sent));
/* Print out string sent */
printf(" (msg: %s)\n", sent);
编辑2:
这是关于堆与堆栈的页面。这是关于嵌入式设备上的动态分配及其涉及的问题的stackoverflow问题。