Erreur de segmentation – pointeur de caractère

Dans le code ci-dessous, la ligne:

*end = *front; 

donne une faute de segmentation. J’ai posé une question similaire ici mais je ne suis pas sûr que ce soit parce que j’ai deux copies de num. S’il vous plaît expliquer pourquoi il est se-faute. Je vous remercie.

 #include  #include  #include  char* getPalin(char* num); int main() { char* num = (char*)malloc(100); num = "123456"; printf("%s\n", getPalin(num) ); return 0; } char* getPalin(char* num) { int length = strlen(num); if ( length % 2 == 0 ) { char* front = num; char* end = num + strlen(num) - 1; //pointer to end while( front != num + (length/2) ) //pointers not middle yet { *end = *front; printf("%c", *end); front++; end--; } } return num; } 

Ces deux lignes:

 char* num = (char*)malloc(100); num = "123456"; 

avoir l’effet suivant.

Le premier alloue 100 octets et définit num pour qu’il pointe vers ces octets.

La seconde change num pour pointer sur la chaîne “123456” qui est presque certainement en mémoire morte.

Toute tentative de modification du contenu de la mémoire en lecture seule entraînera une violation de segmentation. Vous devez copier la chaîne dans le malloc ‘d num avant de tenter de la changer, avec:

 strcpy (num, "123456"); 

C’est la ligne que vous devriez avoir là où vous avez actuellement:

 num = "123456"; 

Utilisation

 strncpy(num, "123456", 100); 

au lieu de

 num = "123456"; 

Selon la réponse de Konstantin.

Vous avez déjà alloué de la mémoire à num avec l’instruction malloc.

Si vous ne l’aviez pas fait, vous pourriez vous en tirer avec:

 char* num = "123456"; 

Ce qui définirait et allouerait de la mémoire à la volée, mais celle-ci serait très probablement allouée sous forme de constante et donc en lecture seule.

Utiliser strncpy plutôt que strcpy pour copier “123456” garantira que tout espace supplémentaire situé au-delà de la fin de la chaîne est également initialisé à null, à condition que vous spécifiez n comme étant 100 (pour votre exemple). Sinon, sans initialiser la mémoire allouée par malloc sur null (memset (num, 0, 100)), il est concevable de pouvoir aller au-delà de la fin de la chaîne.

Oh presque oublié. Il est conseillé d’utiliser strcpy_s ou strncpy_s car ils sont plus sécurisés, bien que cela n’ait aucune importance pour votre code.

La raison de l’erreur est la suivante:

  char* num = (char*)malloc(100); 

Dans cette ligne, vous avez déclaré num en tant que pointeur sur un tableau ou sur son premier élément, et non en tant que chaîne.

  num = "123456"; 

Cette ligne vous avez utilisé num comme vous l’avez déclaré sous forme de chaîne. C’est une violation de la segmentation et donc de la faute seg. La syntaxe préférable (correcte) pour votre code est la suivante:

  char num[100]; strcpy(num,"123456"); //Even if you use num="123456"; here it would still be wrong 

OU

  char* num = (char*)malloc(100); strcpy(num,"123456"); 

OU

  char num[100]={'1','2','3','4','5','6'}; 

N’importe lequel d’entre eux ferait votre travail.