Je suis confus sur la ligne de code suivante:
#include <stdio.h> int main () { char* words[] = { "aaa", "bbbb", "ccccc", "dddddd" }; printf("\n\n(*words)[0] = %s", words[0]); printf("\n\n(*words)[0]+1 = %s", words[0]+1); return 0; }
8 Réponses :
mots [0] pointe vers le premier "A" dans "AAA". P>
mots [0] +1 déplace ce pointeur le long d'un personnage, il s'agit donc de pointer à la seconde 'A'. P>
mots [1] points sur "BBBB" P>
mots [1] +1 points "BBB", par ex. le deuxième 'B' dans "BBBB". P>
mots [0] renvoie l'adresse de AAA. Ajout de 1 à cela incrémente l'adresse à pointer vers la seconde a. P>
Voulez-vous avoir des mots [0 + 1]? P>
Cela devrait vous donner ce que vous attendez. P>
char* words[] = { "aaa", "bbbb", "ccccc", "dddddd" }; All the 4 strings have static storage duration and are allocated prior to the program startup.In the initializer, the arrays are converted to pointers to char and the words array is initialized with the pointer values.
Les chaînes littérales sont stockées dans la mémoire statique. Leur emplacement réel est dépendant de la mise en œuvre mais les chaînes littérales sont stockées quelque part em>, typiquement dans la partie de données de l'exécutable - il n'est ni dynamique ni attribution de pile. Votre tableau contient alors des pointeurs sur ces emplacements. P>
mots [0] +1 doit indiquer sur la chaîne BBBB et non au deuxième caractère d'AAA. P>
blockQuote>
Ce n'est tout simplement pas la façon dont l'indexation de tableau fonctionne. Vous indexez le tableau des chaînes avec
mots [0] code>, vous avez maintenant une chaîne et toutes les opérations s'appliquent à cette chaîne. Vous ne pouvez pas faire de l'arithmétique avec des indices de tableau en dehors de l'indice. Pour accéder à la chaîne
"bbbb" code>, vous utiliseriez des mots
[1] code>. P>
La différence est parce que Le premier point sur le deuxième caractère dans mots [0] +1 code> n'est pas identique à celui des mots
[0 + 1] code>. p>.
mots [0] code>, tandis que ce dernier pointe vers le deuxième mot. P>
La façon dont je le vois, les mots [0] +1 doivent pointer sur la chaîne BBBB et non au deuxième caractère d'AAA P> blockQuote>
Non.
mots [0] code> est un pointeur de caractère lui-même - il est parfaitement amende que vous obtenez le deuxième caractère de "AAA" en y ajoutant un. Ce que vous voulez, c'est
mots + 1 code> ou
& mots [0] + 1 code> qui sera correctement "BBBB". P>
En outre, les chaînes elles-mêmes sont allouées lors du lancement de l'exécutable et sont probablement placées dans la section de données ou de BSS du binaire par la liaison. De plus, lorsque vous déclarez et initialisez
mots code>, il sera attribué sur la pile comme tout autre tableau automatique et ses éléments seront affectés aux pointeurs au début de chaque constante de chaîne. P>
Je vois. J'ai effectivement essayé de faire des choses telles que mots [1] [1] = 'u' code> pour changer
bbbb code> dans
bubb code>, mais
bbbb code> reste la même chose après que je l'ai changé (!). Est-ce alors parce que les cordes sont en lecture seule (je suppose qu'ils sont depuis qu'ils sont des r devalues)?
@Curvature Oui, ils sont. Soyez content que cela ne changeait pas - modifier les constantes de chaîne est UB.
L'espace de pile et de tas est alloué de manière dynamique - c'est-à-dire qu'ils sont alloués au moment de l'exécution. Votre code compilé est-il attribué dynamiquement, sur le tas ou la pile? Évidemment ni ni. Le stockage pour les constantes est similaire au stockage pour le code ... ils sont stockés dans l'exécutable sur disque et sont chargés en mémoire en lecture seule. (Note pour les pédants: Voici comment les choses sont faites dans une mise en œuvre typique; il n'est pas mandaté par la norme linguistique.) P>
dans le format de votre printf que vous avez "(* mots) [0]", mais c'est différent. mots [0] code> est l'adresse du premier "A" de "AAAA". L'ajout de 1 à cette adresse devrait sûrement donner l'adresse de la seconde «A» de «AAAA». L'adresse de "BBBB" est la voie à
mots [1] code>. P>
* mots code> est identique à celui des mots
[0] code>.
(* mots) [0] code> est identique que
** mots code>, qui est le premier "A" (pas son adresse) de "AAAA". Vous imprimeriez
(* mots) [0] code> avec
% c code>, pas
% s code>. P>.
Ceci est comme ..
P>
Depuis les mots un tableau de caractère des pointeurs afin que chaque index de matrice de mots tiendra la Adresse du littéral à chaîne, c'est-à-dire. Adresse de base des littéraux à chaîne Si vous imprimerez P>
printf("%s",words[0])// index 0 will print aaa.
Êtes-vous confondre
mots [0] + 1 code>,
(mots + 1) [0] code> et
mots [1] code>?