从R语言调用的C函数中的动态内存分配

从R语言调用的C函数中的动态内存分配,c,r,memory,memory-management,C,R,Memory,Memory Management,我正在编写一个调用C脚本的R包。C脚本使用具有动态确定长度的结构:数组林->边的长度取决于从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_

我正在编写一个调用C脚本的R包。C脚本使用具有动态确定长度的结构:数组
林->边的长度取决于从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\u new
时崩溃。我的直觉是,崩溃是由内存分配造成的,事实上,它提到了分配内存的替代方法(例如
R\u alloc
Calloc
),这似乎表明应该使用
malloc
/
Calloc

因此,问题的第1部分是何时应该或必须用R-safe等价物替换对
malloc
/
calloc
的调用(也许它们与我的问题无关?)。
问题的第2部分是R-safe函数如何处理长度动态确定的结构。

您可以在包中使用
malloc/calloc
free
来分配和释放内存,但您必须像在任何C应用程序中一样处理内存不足错误。您可以使用R提供的
Calloc/Free/Realloc
,然后以“R方式”(内存不足时的R错误)处理错误。
R\u alloc
函数允许您分配临时数据,这些数据在外部函数退出时自动释放(当您返回到R时,它是基于堆栈的分配)

R不关心您的C代码是否使用具有动态确定长度的结构(灵活的数组),R根本不访问您的结构

如果您需要更多帮助,请发布一个自包含的示例或提供有关错误的更多信息。也许还值得检查
n\u edge
forest\u new
中是否有正确/正常的值