2008-12-19 8 views
1

J'utilise cet exemple:chaîne Copier pointeur vers pointeur

char *myData[][2] = 
{{"John", "[email protected]"}, 
{"Erik", "[email protected]"}, 
{"Peter","[email protected]"}, 
{"Rikard","[email protected]"}, 
{"Anders","[email protected]"}}; 

char **tableData[6]; 
tableData[0] = myData[0]; 
tableData[1] = myData[1]; 
tableData[2] = myData[2]; 
tableData[3] = myData[3]; 
tableData[4] = myData[4]; 
tableData[5] = NULL;//null terminated array 

et que vous voulez plutôt placer mes propres chaînes pour le nom et e-mails. (en essayant de placer la chaîne xyz dans myData, puis tableData) strcpy avec myData ne fonctionnera pas. J'ai essayé toutes les combinaisons de pointeurs et de références mais il ne semble pas copier la chaîne. Aucune suggestion?

   ok--> strncpy(xyz, argv[i], strlen(argv[i])); 
      ok--> strcpy(xyz + strlen(argv[i]), "\0"); 
run time stops here--> strncpy(myData[i][0], xyz, strlen(xyz)); 
        tableData[i] = myData[i]; 
+0

Ce n'est pas le problème, mais vous devriez regarder de plus près ce que strlen() et strncpy() font. Les deux lignes: ok -> strncpy (xyz, argv [i], strlen (argv [i])); ok -> strcpy (xyz + strlen (argv [i]), "\ 0"); ne sont pas plus sûr (et beaucoup moins efficace) que strcpy (xyz, argv [i]); – Dipstick

Répondre

3

Les pointeurs myData[][] comme vous l'avez initialisé le point de chaînes de caractères. Cette mémoire ne peut pas être écrite.

Vous pouvez allouer de la nouvelle mémoire pour vos nouvelles chaînes et placer les pointeurs sur les nouvelles chaînes dans myData. Ou pour ce que vous semblez faire, il suffit de stocker les pointeurs sur les chaînes argv [] (tant que vous ne prévoyez pas de modifier les chaînes plus tard).

De même, assurez-vous que le bloc de mémoire dans lequel vous copiez les chaînes est suffisamment grand pour contenir la nouvelle chaîne.

Logiciel Monkey Edit: y compris le terminateur \ 0; et assurez-vous de libérer la mémoire lorsque cela est approprié.

0

Créez votre propre copie locale des données et de changer le pointeur dans la liste:

char **newentry = malloc(sizeof(char*) * 2); 
newentry[0] = strdup(myNewName); 
newentry[1] = strdup(myNewEmail); 
tableData[i] = newentry; 

C'est la partie facile. Le plus dur est de libérer la mémoire lorsque vous avez terminé. Si c'est juste un petit programme en C, vous pouvez probablement partir sans libérer de la mémoire puisque le système d'exploitation le libérera automatiquement lorsque l'application sera fermée.

Mais si vous voulez le faire correctement avec un « P », je fais quelques petites fonctions pour copier et articles de table libre:

void tableFreeItem(int i) 
{ 
    if(tableData[i] != 0) 
    { 
     free(tableData[i][0]); 
     free(tableData[i][1]); 
     free(tableData[i]); 
    } 
} 

void tableSetItem(int i, char *name, char *email) 
{ 
    tableFreeItem(i); 

    tableData[i] = malloc(sizeof(char *) * 2); 
    tableData[i][0] = strdup(name); 
    tableData[i][1] = strdup(email); 
} 

Maintenant, nous pouvons remplacer les éléments dans la liste à volonté et nous pouvons facilement libérer la mémoire en appelant la fonction tableFreeItem(). Voici un exemple de la façon dont vous pouvez utiliser ces fonctions:

#define TABLE_SIZE 5 

char **tableData[TABLE_SIZE + 1]; /* +1 to make room for NULL terminator */ 

/* Clear out the table. This also sets up the NULL terminator at the end. */ 
    memset(tableData, 0, sizeof(tableData)); 

/* Copy the original data into the table */ 
    for(i = 0; i < TABLE_SIZE; i++) 
     tableSetItem(i, mydata[i][0], myData[i][1]); 

/* Change a data item */ 
    tableSetItem(3, "Adam Pierce", "[email protected]"); 

/* Free memory when we have finished */ 
    for(i = 0; i < TABLE_SIZE; i++) 
     tableFreeItem(i); 

DISCLAIMER: Je ne l'ai pas essayé de compiler ou exécuter ce code, je viens a cogné hors du haut de ma tête. Cela fonctionnera probablement.

Questions connexes