Passer un tableau de chaînes à une faute de segmentation de fonction

Donc, j’ai écrit ce code ci-dessous qui est supposé passer un tableau de chaînes à une fonction, qui sortinge ensuite le tableau dans l’ordre alphabétique. Je sais que ce que j’ai fait n’est probablement pas joli, mais c’est pour l’école et je dois le transmettre à une fonction et utiliser strcmp . J’ai rencontré quelques problèmes, mais j’ai réussi à résoudre toutes les erreurs de compilation. Maintenant, cependant, lorsque j’essaie d’exécuter le programme, l’erreur d’erreur de segmentation fault(core dumped) . Quelqu’un peut-il me guider là où j’ai commis mon erreur?

 #include #include #include #include void sort(char *str[]); int main() { char *states[11] = {"Florida", "Oregon", "California", "Georgia"}; sort(states); return 0; } void sort(char *str[]) { int x, y; char alpha[11] = {0}; for(x = 1; x < 4; x++){ for(y = 1; y  0){ strcpy(alpha, str[y - 1]); strcpy(str[y - 1], str[y]); strcpy(str[y], alpha); } } } printf("\nThe states, in order, are: "); for(x = 0; x < 4; x++) printf("\n%s", str[x]); } 

Vous ne pouvez pas écraser les littéraux de chaîne, ce que strcpy() : modifier des littéraux de chaîne appelle un comportement indéfini, mais remplace les pointeurs.

Ce

 strcpy(alpha, str[y - 1]); strcpy(str[y - 1], str[y]); strcpy(str[y], alpha); 

fonctionnerait très bien comme

 alpha = str[y - 1]; str[y - 1] = str[y]; str[y] = alpha; 

si vous déclarez alpha comme

 char *alpha; 

Notez également que la taille des cordes n’est pas de 11 pouces

 char *states[11]; 

C’est le nombre de pointeurs que le tableau peut contenir. Les pointeurs pointent vers des littéraux de chaîne, dont la taille n’est pas vraiment importante dans ce cas. L’important est que le tableau contienne des pointeurs et que vous puissiez faire en sorte que les pointeurs pointent ailleurs, mais vous ne pouvez pas modifier la mémoire statique comme celle occupée par le littéral chaîne.

En ajoutant à la réponse par iharob, votre code devrait fonctionner si les longueurs de toutes les chaînes sont définies en 11. Votre code se bloque lorsqu’il tente d’échanger “Oregon” avec “Californie”. Puisque la longueur de “California” est de 11 octets et que celle de “Oregon” est de 7 octets (y compris le caractère nul), lorsque vous utilisez strcpy pour écraser le tableau de chaînes “Oregon” avec “California”, votre mémoire tampon dépasse et le programme dump with signal 11. Vous pouvez utiliser l’approche suggérée par iharob ou vous pouvez changer le code comme suit: –

 #include #include #include #include void sort(char str[][11]); int main() { char states[4][11] = {"Florida", "Oregon", "California", "Georgia"}; sort(states); return 0; } void sort(char str[][11]) { int x, y; char alpha[11] = {0}; for(x = 1; x < 4; x++){ for(y = 1; y < 4; y++){ if(strcmp(str[y - 1], str[y]) > 0){ strcpy(alpha, str[y - 1]); strcpy(str[y - 1], str[y]); strcpy(str[y], alpha); } } } printf("\nThe states, in order, are: "); for(x = 0; x < 4; x++) printf("\n%s", str[x]); } 

La sortie produite sera: -

 gaurav@ubuntu:~$ ./a.out The states, in order, are: California Florida Georgia Oregon