我正在编写一个调用C脚本的R包。 C脚本使用具有动态确定长度的结构:数组forest->edges
的长度取决于从R传递的数据。
typedef struct {
unsigned int n_edge;
...
unsigned int max_node;
unsigned int edges[];
} forest;
forest * forest_new (unsigned int *n_edge) {
forest *f = malloc(sizeof(forest) + (2 * *n_edge * sizeof(int)));
f->n_edge = *n_edge;
...
f->max_node = 0;
return f;
}
代码在C中成功运行,但在R调用触发forest_new
时崩溃。我的预感是崩溃是由内存分配造成的,实际上R manual提到了分配内存的替代方法(例如R_alloc
,Calloc
),threads {{3} }似乎建议应该用来代替malloc
/ calloc
。
问题的第一部分是对malloc
/ calloc
的调用应该或必须由R安全等价物替换(可能它们与我的问题无关?)。
问题的第2部分是R-safe函数如何处理长度是动态确定的结构。
答案 0 :(得分:1)
您可以在包中使用free
和Calloc/Free/Realloc
来分配和释放内存,但您必须处理任何C应用程序中的内存不足错误。您可以使用R提供的R_alloc
,然后您将获得以“R方式”处理的错误(内存不足时出现R错误)。 n_edge
函数允许您分配在外部函数退出时自动释放的临时数据(当您返回R时,它是基于堆栈的分配)。
R不关心您的C代码是否使用具有动态确定长度的结构(灵活数组),R根本不访问您的结构。
如果您需要更多帮助,请发布自包含的示例或提供有关错误的更多信息。也许值得检查forest_new
在localhost
中有正确/合理的值。