[英]Dynamic memory allocation in C functions called from R language
我正在編寫一個調用 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_alloc
, Calloc
),該線程 別處似乎表明應該代替使用malloc
/ calloc
。
所以問題的第 1 部分是對malloc
/ calloc
調用何時應該或必須被 R 安全等價物替換(也許它們與我的問題無關?)。 問題的第 2 部分是 R 安全函數如何處理長度是動態確定的結構。
您可以在包中使用malloc/calloc
和free
來分配和釋放內存,但您必須像在任何 C 應用程序中一樣處理內存不足錯誤。 您可以使用 R 提供的Calloc/Free/Realloc
,然后您將獲得以“R 方式”處理的錯誤(內存不足時的 R 錯誤)。 R_alloc
函數允許您分配在外部函數退出時自動釋放的臨時數據(當您返回 R 時,它是基於堆棧的分配)。
R 不關心您的 C 代碼是否使用動態確定長度的結構(靈活數組),R 根本不訪問您的結構。
如果您需要更多幫助,請發布一個獨立的示例或提供有關錯誤的更多信息。 或許,這也是值得一試n_edge
已經在正確的/理智值forest_new
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.