it-swarm.com.de

Erstellen Sie mit malloc dynamisch ein Array von Zeichenfolgen

Ich versuche, ein Array von Zeichenfolgen in C mit malloc zu erstellen. Die Anzahl der Zeichenfolgen, die das Array enthalten wird, kann sich zur Laufzeit ändern, die Länge der Zeichenfolgen ist jedoch immer konsistent.

Ich habe dies versucht (siehe unten), aber ich habe Probleme, alle Tipps in die richtige Richtung werden sehr geschätzt!

#define ID_LEN 5
char *orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */

orderedIds = malloc(variableNumberOfElements * (ID_LEN + 1));

Letztendlich möchte ich das Array verwenden können, um dies zu tun:

strcpy(orderedIds[0], string1);
strcpy(orderedIds[1], string2);
/* etc */
33
Chris

Sie sollten ein Array von Zeichenzeigern zuweisen und dann für jeden Zeiger genügend Speicher für die Zeichenfolge zuweisen:

char **orderedIds;

orderedIds = malloc(variableNumberOfElements * sizeof(char*));
for (int i = 0; i < variableNumberOfElements; i++)
    orderedIds[i] = malloc((ID_LEN+1) * sizeof(char)); // yeah, I know sizeof(char) is 1, but to make it clear...

Scheint mir ein guter Weg zu sein. Obwohl Sie viele Mallocs ausführen, weisen Sie einem bestimmten String eindeutig Speicher zu, und Sie können einen Speicherblock freigeben, ohne das gesamte "String-Array" freizugeben.

54
MByD

Angesichts der Tatsache, dass Ihre Zeichenfolgen alle eine feste Länge haben (vermutlich zur Kompilierungszeit?), Können Sie Folgendes tun:

char (*orderedIds)[ID_LEN+1]
    = malloc(variableNumberOfElements * sizeof(*orderedIds));

// Clear-up
free(orderedIds);

Eine umständlichere, aber allgemeinere Lösung besteht darin, ein Array von Zeigern zuzuweisen und diese per Pseudoinitialisierung so zu initialisieren, dass sie auf Elemente eines Raw-Backing-Arrays verweisen:

char *raw = malloc(variableNumberOfElements * (ID_LEN + 1));
char **orderedIds = malloc(sizeof(*orderedIds) * variableNumberOfElements);

// Set each pointer to the start of its corresponding section of the raw buffer.
for (i = 0; i < variableNumberOfElements; i++)
{
    orderedIds[i] = &raw[i * (ID_LEN+1)];
}

...

// Clear-up pointer array
free(orderedIds);
// Clear-up raw array
free(raw);
6
char **orderIds;

orderIds = malloc(variableNumberOfElements * sizeof(char*));

for(int i = 0; i < variableNumberOfElements; i++) {
  orderIds[i] = malloc((ID_LEN + 1) * sizeof(char));
  strcpy(orderIds[i], your_string[i]);
}
5
sahaj

#define ID_LEN 5
char **orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */

orderedIds = (char **)malloc(variableNumberOfElements * (ID_LEN + 1) * sizeof(char));

..

0
Roman