2010-02-16 1 views
2
char sXSongBuffer[20][30]; 
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"}; 

Pourquoi cela renvoie l'erreur expected expression before ‘{’ token? La raison pour laquelle je veux initialiser mon tableau comme celui-ci est pour que je puisse changer son contenu comme celui-ci plus tard:Pourquoi ne puis-je pas initialiser un tableau de chaînes comme celui-ci?

sXSongBuffer = {"New Song", "More Music From Me"}; 

Répondre

6

Vous ne pouvez pas affecter à des tableaux en C. C permet init alization tableaux avec des valeurs qui sont des constantes de compilation. Si vous souhaitez modifier les valeurs ultérieurement ou définir des valeurs qui ne sont pas des constantes de compilation, vous devez les affecter manuellement à un index particulier du tableau.

Ainsi, votre affectation à sXSongBuffer est refusée en C. En outre, étant donné que sXSongBuffer[0]-sXSongBuffer[19] sont des tableaux aussi, vous ne pouvez pas même dire: sXSongBuffer[0] = "New Song";

En fonction de ce que vous voulez, cela peut fonctionner pour vous:

/* declare sXSongBuffer as an array of pointers */ 
char *sXSongBuffer[30] = { 
    "Thriller", 
    "Don't Stop Till You Get Enough", 
    "Billy Jean", 
    NULL /* set the rest of the elements to NULL */ 
}; 
size_t i; 
/* and then later in your code */ 
sXSongBuffer[0] = "New Song"; 
sXSongBuffer[1] = "More Music From Me"; 
for (i=2; i < sizeof sXSongBuffer; ++i) 
    sXSongBuffer[i] = NULL; 

Mais ce qui précède ne fonctionne que si vous connaissez toutes vos chaînes au moment de la compilation. Sinon, vous devrez décider si vous voulez des tableaux "assez grands", ou si vous avez besoin de mémoire dynamique pour les chaînes et/ou le nombre de chaînes. Dans les deux cas, vous devrez utiliser un équivalent de strcpy() pour copier vos chaînes.

Modifier: Pour répondre au commentaire:

Vous déclarez un tableau de 30 pointeurs avec les trois ombles premiers éléments pointant vers buffers de la taille des chaînes, à savoir le buff pointé par sXSongBuffer[0] ne tiendra pas de chaîne plus grande que "Thriller" et s'il le fait sXSongBuffer[0] = malloc(32); Il obtiendra un poireau mémoire mineur. En outre, il devra malloc mémoire pour chacun des autres emplacements dans le tableau. Il doit soit utiliser des tableaux char 2d comme dans l'OP + un init désigné, ou malloc chaque tampon à l'exécution et copier dans les valeurs. Il aura également besoin de se souvenir de free toute mémoire il malloc s.

sXSongBuffer dans char *sXSongBuffer[30]; est une matrice de taille 30, chaque élément étant une char *, un pointeur vers char. Quand je le fais:

char *sXSongBuffer[30]; 

chacun de ces 30 pointeurs n'est pas initialisé.Quand je le fais:

char *sXSongBuffer[30] = { "Thriller", ... }; 

Je définis les pointeurs sur différents emplacements en lecture seule. Il n'y a rien qui m'empêche de "re-pointer" les pointeurs ailleurs. Il est comme si j'avais:

char *data = "Hello"; 
printf("%s\n", data); 
data = "Hello, world"; 
printf("%s\n", data); 

Dans l'extrait ci-dessus, j'assignez data à "Hello" d'abord, puis changer pour pointer vers une chaîne plus tard. Le code que j'avais ci-dessus dans ma réponse n'a fait que réaffecter sXSongBuffer[i] à quelque chose d'autre plus tard, et puisque sXSongBuffer[i] est un pointeur, l'affectation est OK. En particulier, sXSongBuffer[0] est un char *, et peut pointer vers n'importe quel emplacement valide qui a un char dedans. Comme je l'ai dit plus tard dans ma réponse, si les chaînes ne sont pas connues à la compilation, ce schéma ne fonctionne pas, et il faut soit utiliser des tableaux avec des tailles «assez grandes», soit allouer dynamiquement de la mémoire qui est assez gros.

+0

Vous déclarez un tableau de 30 pointeurs char avec les trois premiers éléments pointant vers des tampons de la taille des chaînes, c'est-à-dire que le buff pointé par 'sXSongBuffer [0]' ne contiendra aucune chaîne plus grande que "Thriller" et il fait 'sXSongBuffer [0] = malloc (32);' Il obtiendra un poireau mémoire mineur. En outre, il devra mémoire malloc pour chacun des autres emplacements dans le tableau. Il devrait soit utiliser des tableaux de char 2d comme dans l'OP + un init désigné, soit malloc chaque tampon à l'exécution et copier dans les valeurs. Il aura aussi besoin de se rappeler de libérer tout souvenir, il mallocs. –

+0

@Robert: s'il vous plaît voir mon edit. –

0

C n'a pas un tableau à usage général littéraux. La syntaxe de liste {} ne fonctionne que lors de l'initialisation, c'est-à-dire lors de l'attribution de la valeur dans la même instruction qui déclare la variable.

0

Vous ne pouvez pas simplement écrire

char sXSongBuffer[20][30]; 
sXSongBuffer = {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"}; 

Vous devez soit initialiser tableau à la fois (mais cela contiennent seulement 3 articles):

char * sXSongBuffer[]= {"Thriller", "Don't Stop Till You Get Enough", "Billy Jean"}; 

Ou soit utiliser stnrcpy sur chaque article:

char sXSongBuffer[20][30]; 
strncpy(sXSongBuffer[0],"Thriller",29); 
strncpy(sXSongBuffer[1],"Don't Stop Till You Get Enough",29); 
strncpy(sXSongBuffer[2],"Billy Jean",29); 
+0

Il peut utiliser un initialiseur désigné pour obtenir l'effet qu'il veut. –

0

Jetez un oeil à Designated Initializers.

#include <stdio.h> 

int main (void) { 

    char a[6][6] = { [2] = "foo", [4] = "bar" }; 

    for (int i=0; i<6; ++i) 
     printf("%d == %s\n", i, a[i]); 

    return 0; 
} 

Ceci est une caractéristique c99. Compilez avec:

gcc -W -std=c99 2dInit.c -o 2dInit 

Ce sorties:

0 == 
1 == 
2 == foo 
3 == 
4 == bar 
5 == 

Dans votre cas, vous voulez faire:

char sXSongBuffer[20][30] = { 
    [0] = "Thriller", 
    [1] = "Don't Stop Till You Get Enough", 
    [2] = "Billy Jean" 
}; 
Questions connexes