2010-11-11 3 views
1

Cela semble être facile, mais j'ai passé beaucoup trop de temps dessus. J'espère que quelqu'un peut aider.Modification du contenu dans un tableau de pointeurs de caractères

char *string_labels[5] = { "one", "two", "three", "four", "five" }; 

void myFunction(void) 
{ 

    //can print them just like expected 
    for(i=0; i < 5; i++) 
    { 
     printf("%s\n", string_labels[i]); 
    } 

    //how can i change the contents of one of the elements?? 
    sprintf(string_labels[0], "xxx"); <-crashes 

} 
+0

Vous ne pouvez pas - ils sont const. –

+0

est donc cette déclaration la même que const char * string_labels = {"un", "deux", "trois", "quatre", "cinq"}; ? Je pensais que si elle n'était pas déclarée const, elle serait modifiable? Pouvez-vous expliquer pourquoi? Merci d'avoir aidé –

+0

Oui, les littéraux de chaîne sont effectivement const, même s'ils ne sont pas déclarés comme tels. Typiquement, ils résident dans un segment en lecture seule. –

Répondre

4

Il se bloque car il est en mémoire en lecture seule. Essayez

char string_labels[][6] = { "one", "two", "three", "four", "five" }; 
sprintf(string_labels[0], "xxx"); 
2

Pour ce faire, vous devez utiliser un tableau de caractères, de sorte que vous avez réellement un espace d'exécution inscriptible modifier:

char string_labels[][20] = { "one", "two", "three", "four", "five" }; 

void myFunction(void) 
{ 
    /* Printing works like before (could be improved, '5' is nasty). */ 
    for(i=0; i < 5; i++) 
    { 
     printf("%s\n", string_labels[i]); 
    } 

    /* Now, modifying works too (could be improved, use snprintf() for instance. */ 
    sprintf(string_labels[0], "xxx"); 
} 
0

string_labels est un tableau de pointeurs char pointant chaîne littéraux. Puisque les littéraux de chaîne sont en lecture seule, toute tentative de les modifier conduit à un comportement indéfini.

Vous pouvez modifier la déclaration de string_labels comme ci-dessous pour faire votre sprintf travail:

char string_labels[][6] = { "one", "two", "three", "four", "five" }; 
0

Chacun de string_labels[i] pointe sur une chaîne littérale, et de tenter de modifier le contenu d'un invoque chaîne littérale comportement non défini.

Vous devez déclarer string_labels comme un tableau de tableaux de char, plutôt que comme un tableau de pointeurs vers char:

#define MAX_LABEL_LEN ... // however big the label can get + 0 terminator 

char string_labels[][MAX_LABEL_LEN]={"one", "two", "three", "four", "five"}; 

Ceci déclare un tableau 5 éléments (taille prise du nombre de initialiseurs) de MAX_LABEL_LEN tableaux de char. Maintenant vous pouvez écrire au contenu de string_labels[i].

Questions connexes