Initialisation des tableaux de type char
Je veux initialiser arbitraire des grandes chaînes. Elle est terminée par nul chaîne de caractères, mais je ne peux pas imprimer son contenu.
Quelqu'un peut-il me dire pourquoi?
char* b;
char c;
b = &c;
*b = 'm';
*(b+1) = 'o';
*(b+2) = 'j';
*(b+3) = 'a';
*(b+4) = 'char* b;
char c;
b = &c;
*b = 'm';
*(b+1) = 'o';
*(b+2) = 'j';
*(b+3) = 'a';
*(b+4) = '\0';
printf("%s\n", *b);
';
printf("%s\n", *b);
- *(b+1) est une mémoire quelque part que vous ne possédez pas et ne devrait pas l'utiliser.
Vous devez vous connecter pour publier un commentaire.
Votre solution invoque comportement indéfini, parce que
*(b+1)
etc. sont à l'extérieur des limites de la pile variablec
. Donc, lorsque vous écrivez, vous avez écrit tous les plus de la mémoire qui ne t'appartiennent pas, ce qui peut causer toutes sortes de corruption. Aussi, vous devezprintf("%s\n", b)
(printf
attend un pointeur pour%s
).La solution dépend de ce que vous voulez faire. Vous pouvez initialiser un pointeur vers une chaîne de caractères littérale:
Vous pouvez initialiser un tableau de caractères:
Cela peut aussi être écrit comme:
Ou vous pouvez affecter manuellement les valeurs de votre chaîne:
Cela peut provoquer une erreur de segmentation! *(b+1), *(b+2), etc référer à des zones non alloué. D'abord allouer de la mémoire et d'écrire dedans!
b
n'a pas assez d'espace pour contenir tous ces personnages. Allouer suffisamment d'espace à l'aide demalloc
ou de déclarerb
comme unchar
tableau.Votre code n'est pas du tout en sécurité! Vous allouer seulement 1 char sur la pile avec
char c;
mais écrire 5 caractères en elle! cela vous donnera une pile de dépassement de ce qui peut être très dangereux.Une autre chose: vous ne devez pas déréférencement de la chaîne lors de l'impression:
printf("%s\n", b);
Pourquoi ne pas tout simplement écrire
const char *b = "mojo";
?Vous devez affecter la mémoire de l'espace, que ce soit avec
malloc
ou à l'aide d'un tableau statique. Ici, dans votre code, vous êtes à l'aide de l'adresse de l'un de caractères pour stocker les adresses de ces personnages, et autres à la suite. Ce n'est pas définie.Note, étape par étape, ce que vous faites. Tout d'abord, vous affectez le pointeur sur un char de l'espace dans la mémoire. Puis, à l'aide
*b = 'm'
vous jeu de mémoire pour le caractère 'm'. Mais ensuite, vous accédez à la prochaine position de mémoire (qui n'est pas définie, car pas de mémoire est réservé pour ce poste) pour stocker une autre valeur. Cela ne fonctionnera pas.Comment faire?
Vous avez deux options. Par exemple:
Cela fonctionne parce que vous avez l'espace pour les 5 caractères dans
c
. L'autre option consiste à affecter directement la mémoire pourb
à l'aide demalloc
:Enfin, peut-être pas ce que vous voulez, mais vous pouvez initialiser un char tableau ou pointeur à l'aide d'une chaîne de caractères littérale:
Le printf ne pas imprimer car il s'attendre à un char*, donc vous devriez passer en b, pas d' *b.
Pour initialiser un pointeur vers une chaîne de caractères que vous pouvez faire quelque chose comme:
char *s1 = "A string"
ou
char s2[] = "Another string"
ou allouer un tampon avec
char *b = malloc(5)
, puis écrire dans cette mémoire tampon (comme vous l'avez fait, ou avec les fonctions de chaîne)ce que vous avez fait était de prendre l'adresse d'un char emplacement de la mémoire et ensuite écrire le passé, peut-être d'écraser les autres variables ou des instructions, et donc qui peut conduire à la corruption de données ou de collision.
Si vous écrivez ce qui suit au lieu de votre printf, il affichera le premier caractère.
Dans l'ordre pour vous d'avoir arbitrairement grandes chaînes, vous devrez utiliser une bibliothèque comme bstring ou écrire votre propre.
C'est parce que, en C, on doit obtenir de la mémoire, de l'utiliser et de les libérer en conséquence.
b
dans votre cas, seuls les points à un personnage, à moins que vous allouer de la mémoire à l'aide demalloc
. Et pourmalloc
, vous devez spécifier une taille fixe.Pour arbitrairement grande chaîne, vous devez vous encapsuler le réel pointeur de caractère dans une structure de données de votre choix, puis de gérer sa taille en fonction de la longueur de la chaîne qui est fonction de sa valeur.
pourquoi *?
est ce que vous voulez