2009-07-11 5 views
8

Je pensais que vous pouviez déclarer un tableau, puis l'initier plus tard.C Déclarer un tableau de char *

Comme si

char* myArray[3]; 


//CODE INBETWEEN 

myArray[3] = { 

      "blah", 
      "blah", 
      "blah"}; 
+1

Vous déclarez un tableau de pointeurs de caractères. Chaque pointeur doit pointer vers un tampon dynamique ou statique avant de pouvoir utiliser strcpy() ou d'autres opérations de chaîne pour modifier le contenu. – stanigator

+0

Donc, je dois initlize et déclarer en même temps?> –

Répondre

18

Non, vous ne pouvez initialiser un tableau lorsque vous déclarez. La raison en est que les tableaux ne sont pas des valeurs modifiables.

Dans votre cas:

char *array[] = {"blah", "blah", "blah"}; 

Vous n'avez pas besoin de préciser la taille, mais vous pouvez si vous le souhaitez. Cependant, la taille ne peut pas être inférieure à 3 dans ce cas. En outre, les trois chaînes sont écrites en mémoire en lecture seule, donc quelque chose comme array[1][2] = 'c' pour changer le 2ème "blah" en "blch" se traduira normalement par un segfault.

+2

Plus précisément, les tableaux dans la plupart des contextes sont évalués par des valeurs, et non par des valeurs, et l'affectation à une valeur n'est pas autorisée. – caf

+0

En fait, votre explication est probablement plus correcte. Edité mon message. –

0

Vous avez eu tort. L'initialisation est seulement possible à déclaration. Après cela, vous ne pouvez affecter que des valeurs individuelles.

0

C'est une expression d'initialisation. Ne peut pas avoir ce code entre les deux, doit être utilisé sur la ligne avec la déclaration.

2

Comme d'autres l'ont dit, vous ne pouvez utiliser les initialisers que lorsque la variable est déclarée. La façon la plus proche de faire ce que vous voulez est:

char *myArray[3]; 

/* CODE INBETWEEN */ 

{ 
    static const char *tmp[3] = { 
      "blah", 
      "blah", 
      "blah" }; 
    memcpy(myArray, tmp, sizeof myArray); 
} 
1

Oui, vous pouvez déclarer un tableau, puis l'initialiser plus tard.
Cependant, il existe une exception ici.
Vous déclarez un tableau de pointeurs (qui a bien fonctionné).
Et puis vous êtes instanciation des chaînes constantes pour les affecter au tableau.

C'est là que le problème commence.
Les chaînes constantes ne sont que des primitives de compilation qui n'obtiennent aucun emplacement de mémoire adressable comme vous les avez utilisées. Ils peuvent être assignés dès l'initialisation du tableau (comme l'a montré Mike); Cela demandera au compilateur de les allouer en tant que constantes disponibles au moment de l'exécution et autorisera une initialisation lorsque la portée de myArray commencera.


Ce que vous avez essayé aurait bien fonctionné avec

int numberArray[3]; 
// code here 
numberArray[0] = 1; 
numberArray[1] = 2; 
numberArray[2] = 3; 

Il aide à noter qu'un pointeur de caractère et une instance de chaîne sont deux entités différentes; le premier peut pointer vers le second.

+0

Dans votre exemple, vous n'initialisez pas les valeurs. Vous définissez simplement la valeur. Un optimiseur peut transformer ce que vous avez écrit en initialisation mais il n'y a aucune garantie. – Jared

+0

@Jared, je vais prendre votre down-vote et commenter dans l'esprit de la signification exacte de «initialisation».Cependant, je ne pense pas que la question voulait dire le mot dans ce sens. – nik