Les littéraux de chaîne: pointeur vs char tableau
Dans cette déclaration:
char *a = "string1"
Quel est exactement un littéral de chaîne? Est-il string1
? Parce que ce fil Quel est le type de littéraux de chaîne en C et C++? dit quelque chose de différent.
Jusqu'à ma connaissance
int main()
{
char *a = "string1"; //is a string- literals allocated memory in read-only section.
char b[] = "string2"; //is a array char where memory will be allocated in stack.
a[0] = 'X'; //Not allowed. It is an undefined Behaviour. For me, it Seg Faults.
b[0] = 'Y'; //Valid.
return 0;
}
Veuillez ajouter quelques détails autres que les points mentionnés ci-dessus. Merci.
Sortie de débogage montre l'erreur dans a[0] = 'Y';
Reading symbols from /home/jay/Desktop/MI/chararr/a.out...done.
(gdb) b main
Breakpoint 1 at 0x40056c: file ddd.c, line 4.
(gdb) r
Starting program: /home/jay/Desktop/MI/chararr/a.out
Breakpoint 1, main () at ddd.c:4
4 {
(gdb) n
6 char *a = "string1";
(gdb) n
7 char b[] = "string2";
(gdb)
9 a[0] = 'Y';
(gdb)
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400595 in main () at ddd.c:9
le code est illégale, car c'est la tentative de modifier une chaîne de caractères littérale.
Je ne suis pas certain que la question exacte est. Pour plus de détails sur les littéraux de chaîne, voir section 6.4.5 de la norme C99.
Peut-être ce stackoverflow question peut aider, ou celui-ci.
Vous connaissez déjà la modification de littéraux de chaîne est UB et, heureusement, vous obtenez l'erreur lorsque vous essayez de le faire. GDB montre vous obtenez l'erreur de segmentation lorsque vous les modifiez. Quelle est la question?
OK, donc techniquement,
Je ne suis pas certain que la question exacte est. Pour plus de détails sur les littéraux de chaîne, voir section 6.4.5 de la norme C99.
Peut-être ce stackoverflow question peut aider, ou celui-ci.
Vous connaissez déjà la modification de littéraux de chaîne est UB et, heureusement, vous obtenez l'erreur lorsque vous essayez de le faire. GDB montre vous obtenez l'erreur de segmentation lorsque vous les modifiez. Quelle est la question?
OK, donc techniquement,
char *a = "string1";
devrait générer un avertissement du compilateur sur l'initialisation d'un char *
avec un const char *
valeur. Je suppose que la seule raison pour laquelle il n'a pas raison en est que beaucoup trop de code hérité permettrait de lancer des avertissements.OriginalL'auteur Jeyaram | 2012-10-09
Vous devez vous connecter pour publier un commentaire.
Que vous pouvez regarder la chaîne de caractères littérale comme "une séquence de caractères entourée par des guillemets doubles".
Cette chaîne est stockées en mémoire en lecture seule et en essayant de modifier cette mémoire conduit à comportement indéfini.
Alors comment se fait que vous obtenez l'erreur de segmentation?
- Le point principal est que
char *ptr = "string literal"
faitptr
au point de la mémoire en lecture seule où votre littéral de chaîne est stockée. Ainsi, lorsque vous essayez d'accéder à cette mémoire:ptr[0] = 'X'
(ce qui est équivalent à*(ptr + 0) = 'X'
), c'est un violation d'accès mémoire.D'autre part:
char b[] = "string2";
alloue de la mémoire et des copies de la chaîne"string2"
, modifiant ainsi qu'il est valide. Ce mémoire est libérée lorsqueb
est hors de portée.Ont un coup d'oeil à Chaîne littérale de l'initialiseur pour un tableau de caractères
char a[] = "sdsf";
aussi une chaîne littérale.littéral de chaîne est une séquence de caractères entourée par des guillemets doubles". Oui, dans
char a[] = "sdsf";
,"sdsf"
est un littéral de chaîne qui est utilisée pour initialiser la matrice dea
.Merci. j'ai donc mal compris que les littéraux de chaîne sont des chaînes de caractères qui sont allouées dans la mémoire en lecture seule section. Il n'est pas basé sur l'emplacement de la mémoire :).
littéral" est juste une expression. Le point principal est de récupérer l'adresse de la mémoire en lecture seule où votre littéral de chaîne est stockée (
char *ptr = "string literal"
), et puis vous essayez d'accéder à cette mémoire:*(ptr + 1) = 'A'
...Parce que
const char myyear = "2014"
etconst char *myyear = "2014"
sont des choses différentes.OriginalL'auteur LihO