Ma fonction est passée une structure contenant, entre autres choses, un tableau terminé par NULL de pointeurs vers des mots constituant une commande avec des arguments.Comment écraser un tableau de pointeurs char avec une plus grande liste de pointeurs char?
J'effectue une correspondance glob sur la liste des arguments, pour les développer en une liste complète de fichiers, puis je veux remplacer le tableau d'arguments transmis par le nouveau.
La globalisation fonctionne correctement, c'est-à-dire que g.gl_pathv est rempli avec la liste des fichiers attendus. Cependant, j'ai du mal à copier ce tableau dans la structure qui m'a été donnée.
#include <glob.h>
struct command {
char **argv;
// other fields...
}
void myFunction(struct command * cmd)
{
char **p = cmd->argv;
char* program = *p++; // save the program name (e.g 'ls', and increment to the first argument
glob_t g;
memset(&g, 0, sizeof(g));
g.gl_offs = 1;
int res = glob(*p++, GLOB_DOOFFS, NULL, &g);
glob_handle_res(res);
while (*p)
{
res = glob(*p, GLOB_DOOFFS | GLOB_APPEND, NULL, &g);
glob_handle_res(res);
}
if(g.gl_pathc <= 0)
{
globfree(&g);
}
cmd->argv = malloc((g.gl_pathc + g.gl_offs) * sizeof *cmd->argv);
if (cmd->argv == NULL) { sys_fatal_error("pattern_expand: malloc failed\n");}
// copy over the arguments
size_t i = g.gl_offs;
for (; i < g.gl_pathc + g.gl_offs; ++i)
cmd->argv[i] = strdup(g.gl_pathv[i]);
// insert the original program name
cmd->argv[0] = strdup(program);
** cmd->argv[g.gl_pathc + g.gl_offs] = 0; **
globfree(&g);
}
void
command_free(struct esh_command * cmd)
{
char ** p = cmd->argv;
while (*p) {
free(*p++); // Segfaults here, was it already freed?
}
free(cmd->argv);
free(cmd);
}
Edit 1: De plus, je réalise que je dois tenir le programme de retour là-bas comme cmd-> argv [0]
Edit 2: appel Ajouté à calloc
Edit 3: Modifier mem gestion des conseils de Alok
Edit 4: Autres conseils de Alok
Edit 5: Presque travailler .. l'application segfaults lors de la libération de la commande struct
Enfin: On dirait que je manque le NULL de terminaison, afin d'ajouter la ligne:
cmd->argv[g.gl_pathc + g.gl_offs] = 0;
semblait fonctionner.
Alors, ça marche maintenant? Si non, quelle erreur obtenez-vous? Voir aussi ma modification la plus récente à ma réponse. Vous allouez deux fois l'espace pour 'paths [0]', une fois avec 'malloc' et encore avec' strdup'. –
oui, ce code était crufty .. voir la dernière édition. il plante toujours en accédant au nouveau tableau ... peut-être que les caractères \ 0 se perdent dans le shuffle? – Casey
Dans 'cmd-> argv [g.gl_pathc + g.gl_offs] = '\ 0';', le ''\ 0'' est équivalent à' 0', ce qui équivaut à 'NULL' ici, donc vous devriez utilisez 'NULL' au lieu de' '\ 0''. –