Ich schreibe ein R-Paket, das ein C-Skript aufruft. Das C-Skript verwendet eine Struktur mit einer dynamisch bestimmten Länge: die Länge des Arrays forest->edges
auf den Daten abhängig von R. bestandenDynamische Speicherzuweisung in C-Funktionen aus R-Sprache aufgerufen
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;
}
Der Code läuft erfolgreich in C, aber stürzt ab, wenn ein R-Anruf auslöst forest_new
. anstelle von malloc
/calloc
Meine Vermutung ist, dass die Crash-Ergebnisse aus Speicherzuweisung, und in der Tat die R manual erwähnen alternative Mittel zum Zuweisen von Speicher (z R_alloc
, Calloc
), die threadselsewhere vorzuschlagen scheint verwendet werden soll.
So Teil 1 der Frage ist, wenn Anrufe zu malloc
/calloc
sollte oder müssen durch R-Safe-Äquivalente (vielleicht sind sie irrelevant für mein Problem?). Teil 2 der Frage ist, wie die R-Safe-Funktionen mit Strukturen umgehen können, deren Länge dynamisch bestimmt wird.