Je ressens de la confusion à propos d’une erreur de bus dans la chaîne (C)

Je ressens de la confusion à propos de l’échange de deux caractères d’une chaîne avec C. Cela fonctionne bien lorsque je le configure en tant que tableau:

char strBase[8] = "acbdefg";

dans ce cas, je pourrais échanger n’importe quel personnage. Mais cela déclenche l’erreur de bus quand je le configure en chaîne:

char *strBase = "acbdefg";

Merci beaucoup pour quiconque pourrait l’expliquer ou me donner un indice!

La différence ici est que

  char *strBase = "acbdefg"; 

placera acbdefg dans les parties en lecture seule de la mémoire et fera de strBase un pointeur sur celle-ci, rendant illégale toute opération d’écriture sur cette mémoire.

Il n’a pas de nom et a une durée de stockage statique (ce qui signifie qu’il dure toute la vie du programme); et une variable de type pointeur sur caractère, appelée strBase , qui est initialisée avec l’emplacement du premier caractère de ce tableau non nommé en lecture seule.

Tout en faisant:

 char strBase[8] = "acbdefg"; 

place la chaîne littérale dans la mémoire en lecture seule et la copie dans la mémoire nouvellement allouée de la stack.

Donc, ce tableau est alloué en mémoire et sa durée de vie dépend de l’endroit où la déclaration apparaît. Si la déclaration est dans une fonction, elle vivra jusqu’à la fin du bloc dans lequel elle est déclarée et sera presque certainement allouée dans la stack; si elle se trouve en dehors d’une fonction, elle sera probablement stockée dans un “segment de données initialisé” chargé à partir du fichier exécutable dans la mémoire en écriture lors de l’exécution du programme.

Fabrication

 strBase[0] = 'x'; 

légal.

Votre problème est celui de l’allocation de mémoire. Vous avez besoin d’espace pour stocker vos personnages. Quand tu as écrit:

 char strBase[8] = "acbdefg"; 

vous avez créé le stockage automatique (souvent appelé la stack) et l’initialisé avec une chaîne de caractères. Mais quand tu as écrit:

 char *strBase = "acbdefg"; 

vous avez créé un pointeur et l’avez dirigé vers une chaîne constante. Le compilateur place cela dans une partie de la mémoire marquée en lecture seule. Si vous essayez de changer cela, cela entraînera une violation d’access à la mémoire.

Au lieu de cela, vous pourriez faire quelque chose comme:

 const char* strData = "acbdefg"; int size = 1024; char *strBase = (char*)malloc(size); strncpy(strBase, strData, size); ProcessSsortingng(strBase); free(strBase); 

La cause la plus probable est que

 char strBase[8] = "abcdefg"; 

oblige le compilateur à réserver de la mémoire pour un tableau de huit caractères et l’initialise avec la valeur “abcdefg \ 0”. En revanche,

 char *strBase = "abcdefg"; 

réserve uniquement de la mémoire pour un pointeur, initialisé avec l’adresse de la chaîne. “abcdefg” est une chaîne constante et, par conséquent, le compilateur la stocke dans une section de mémoire marquée en lecture seule. Tenter de modifier la mémoire en lecture seule provoque une erreur de la CPU.

Votre compilateur devrait vous avertir de l’incompatibilité constante dans le second cas. Sinon, votre compilateur peut avoir un paramètre qui modifie la lecture seule des chaînes constantes.