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.
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. –
@Robert: s'il vous plaît voir mon edit. –