char *args[MAX_ARGS];
args
est un tableau de pointeurs MAX_ARGS. args
pointe elle-même vers la mémoire du premier pointeur. args
contient l'adresse mémoire dans laquelle se trouve le premier pointeur. args[0]
est la valeur du premier pointeur. args[0][0]
signifie que nous allons dans la mémoire du premier pointeur, puis à l'adresse mémoire pointée par ce pointeur, et que nous obtenons la valeur du premier octet dans cette adresse mémoire.
char *full_command[MAX_ARGS];
Il s'agit également d'un tableau de pointeurs MAX_ARGS. full_command
pointe vers la région de mémoire qui est MAX_ARGS * sizeof(char*)
octets longueur. full_command[0]
est la valeur du premier pointeur à l'intérieur de cette région de mémoire.
Essayons maintenant l'affectation :
full_command = args;
Nous obtenons maintenant la valeur de l'adresse mémoire du premier pointeur dans args
et assigner cette valeur à full_command
variable. La mémoire de full_command
est perdu, il n'est plus accessible par aucune autre poignée. Maintenant, le args[0] = smth
uniquement et seulement si full_command[0] = smth
. full_command
pointe vers la région de mémoire que args
pointe vers.
Pour copier les VALEURS d'un tableau, vous devez copier chaque VALEUR du tableau :
for (size_t i = 0; i < MAX_ARGS; ++i) {
full_command[i] = args[i];
}
ou en utilisant memcpy :
memcpy(full_command, args, sizeof(full_command));
Après cette opération full_command
pointe vers une région différente qui args
Les deux sont sizeof(char*) * MAX_ARGS
octets. Ils contiennent tous deux les mêmes valeurs.
Vous devez assigner chaque valeur du tableau :
struct background_element bg_elem = {
.pid = child,
.number = num_background,
.full_command = { args[0], args[1], args[2], ....<up until MAX_ARGS> },
};
Ce n'est pas très utile, il faut le modifier à chaque fois que MAX_ARGS change. Il faut donc utiliser memcpy ou une boucle :
struct background_element bg_elem = {
.pid = child,
.number = num_background,
};
memcpy(bg_elem.full_command, args, sizeof(bg_elem.full_command));