9
votes

C Déclaration de tableau de char *

Je pensais que vous pourriez déclarer une matrice, puis plus tard l'initiez-la.

Comme si xxx

c

2 commentaires

Vous déclarez une gamme de pointeurs de caractères. Chaque pointeur devrait indiquer un tampon dynamique ou statique avant de pouvoir utiliser Strcpy () ou d'autres opérations de chaîne pour modifier le contenu.


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


6 Réponses :


20
votes

Nope, vous ne pouvez que initialiser un tableau lorsque vous le déclarez d'abord. La raison en est que les tableaux ne sont pas des lvalues ​​non modifiables.

Dans votre cas: xxx

Vous n'avez pas besoin de spécifier 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 à la mémoire en lecture seule, alors quelque chose comme (1] [2] = 'c' pour changer le 2e "bla" sur "blch" entraînera normalement un segfault .


2 commentaires

Plus précisément, les tableaux dans la plupart des contextes évaluent à des fins de renvoiement, pas de lvalues ​​et de l'affectation à une rapalité n'est pas autorisée.


En fait, votre explication est probablement plus correcte. Édité mon post.



0
votes

Tu as cru mal. L'initialisation n'est possible que à déclaration. Après cela, vous ne pouvez attribuer que des valeurs individuelles.


0 commentaires

0
votes

C'est une expression d'initialisateur. Ne peut pas avoir que le code entre les deux, doit être utilisé sur la ligne de déclaration.


0 commentaires

3
votes

Comme d'autres personnes ont dit que vous ne pouvez utiliser que des initialiseurs lorsque la variable est déclarée. Le moyen le 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);
}


0 commentaires

1
votes

Oui, vous pouvez déclarer un tableau puis l'initialiser ultérieurement.
Cependant, il y a une exception ici.
Vous déclarez un tableau POINTER POINTER (qui a fonctionné bien).
Et, alors vous êtes Instanciation des chaînes constantes pour les assigner au tableau .

C'est là que le problème commence.
Les chaînes constantes ne sont que des primitives compilatrices qui ne reçoivent aucun emplacement de mémoire adressable dans la manière dont vous les avez utilisées. Ils peuvent être attribués directement au moment de l'initialisation de la matrice (comme Mike a montré); qui indiquera au compilateur de les affecter en tant que constantes disponibles au moment de l'exécution et permettra d'initialiser une initialisation lorsque la portée du myarray commence.


Ce que vous avez essayé aurait travaillé bien avec xxx

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


2 commentaires

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


@Jaré, je vais prendre votre vote de descente et commenter dans l'esprit de la signification exacte de initialisation . Cependant, je ne pense pas que la question signifiait la Parole dans ce sens.



0
votes

Ce n'est pas parfaitement clair que problème du monde réel vous essayez de résoudre, ici ...

Je pensais que vous pourriez déclarer un tableau,

... qui est possible de tant de façons, mais pour bien cette question, je souhaite vous concentrer sur la déclaration d'un tableau à l'intérieur d'un struct . < Pré> xxx

puis plus tard l'initiez-la.

comme si xxx

techniquement parlant ceci est l'initialisation d'un tableau différent (dans un objet anonyme) suivi d'une affectation de l'ensemble du struct . Il pourrait être utile pour résoudre votre problème du monde réel (quoi que ce soit) ... mais j'espère que ce sera finalement utile pour quelqu'un d'autre plus tard pour savoir que vous pouvez attribuer struct s avec des tableaux à l'intérieur ...


0 commentaires