Allocation dynamique d'un tableau en C
-
Utiliser la fonction
malloc
pour allouer un tableau dynamiquement en C -
Utilisez la fonction
realloc
pour modifier la zone de mémoire déjà allouée en C - Utiliser une macro pour implémenter l’allocation pour un tableau d’objets donnés en C
Cet article présente plusieurs méthodes d’allocation dynamique d’un tableau en C.
Utiliser la fonction malloc
pour allouer un tableau dynamiquement en C
La fonction malloc
est la fonction principale pour l’allocation de la mémoire dynamique sur le tas. Elle alloue le nombre d’octets donné et renvoie le pointeur vers la zone de mémoire. Ainsi, si l’on veut allouer dynamiquement un tableau de certains types d’objets, il faut d’abord déclarer un pointeur vers le type. Ensuite, malloc
doit être appelé en passant en argument le nombre d’éléments multiplié par la taille de l’objet unique.
Dans l’exemple suivant, nous allouons la mémoire pour stocker une chaîne de caractères. errno
est mis à 0 comme requis par le standard de codage sécurisé, et le pointeur renvoyé par l’appel malloc
est vérifié pour vérifier l’exécution réussie de la fonction. Enfin, la fonction memmove
est utilisée pour copier la chaîne de caractères à l’emplacement mémoire alloué.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE * sizeof(char));
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
memmove(arr, str, strlen(str));
printf("arr: %s\n", arr);
free(arr);
exit(EXIT_SUCCESS);
}
Production :
arr: random string to be moved
Utilisez la fonction realloc
pour modifier la zone de mémoire déjà allouée en C
La fonction realloc
est utilisée pour modifier la taille de la région mémoire précédemment allouée par l’appel malloc
. Elle prend l’adresse mémoire d’origine et la nouvelle taille comme second argument. Notez que realloc
peut renvoyer le même pointeur que celui qui a été passé ou un pointeur différent en fonction de la taille demandée et de la mémoire disponible après l’adresse donnée. En attendant, le contenu du tableau précédent restera inchangé jusqu’à une nouvelle taille spécifiée.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
const char *str = "random string to be moved";
int main() {
char *arr = NULL;
errno = 0;
arr = malloc(SIZE);
if (!arr) {
perror("malloc");
exit(EXIT_FAILURE);
}
int num = 102; // User Provided Value
for (int i = 0; i < num; ++i) {
if (i > SIZE) {
arr = realloc(arr, 2 * SIZE);
if (!arr) {
perror("realloc");
exit(EXIT_FAILURE);
}
}
arr[i] = 'a';
}
free(arr);
exit(EXIT_SUCCESS);
}
Utiliser une macro pour implémenter l’allocation pour un tableau d’objets donnés en C
Habituellement, malloc
est utilisé pour allouer un ensemble de certaines structures définies par l’utilisateur. Puisque le malloc
renvoie le pointeur void
et peut être implicitement attribué à n’importe quel autre type, une meilleure pratique consiste à attribuer explicitement le pointeur renvoyé au type correspondant. Comme il est relativement facile de rater des choses et de ne pas inclure la notation correcte, nous avons implémenté une macro expression qui prend le nombre d’éléments dans le tableau et le type d’objet pour construire automatiquement l’instruction malloc
correcte, y compris le cast correct.
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define SIZE 100
typedef enum {
Jan,
Feb,
MAR,
APR,
MAY,
JUN,
JUL,
AUG,
SEP,
OCT,
NOV,
DEC
} month;
typedef struct {
unsigned char dd;
month mm;
unsigned yy;
} date;
#define MALLOC_ARRAY(number, type) ((type *)malloc((number) * sizeof(type)))
int main() {
date *d = NULL;
errno = 0;
d = MALLOC_ARRAY(SIZE, date);
if (!d) {
perror("malloc");
exit(EXIT_FAILURE);
}
free(d);
exit(EXIT_SUCCESS);
}
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn Facebook