簡體   English   中英

從 R 語言調用的 C 函數中的動態內存分配

[英]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_allocCalloc ),該線程 別處似乎表明應該代替使用malloc / calloc

所以問題的第 1 部分是對malloc / calloc調用何時應該或必須被 R 安全等價物替換(也許它們與我的問題無關?)。 問題的第 2 部分是 R 安全函數如何處理長度是動態確定的結構。

您可以在包中使用malloc/callocfree來分配和釋放內存,但您必須像在任何 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM