2012-12-08 4 views
4

Possible en double:
Why do I get a segmentation fault when writing to a string?C++: Permutation a-variables

J'ai le programme suivant:

#include <iostream> 
using namespace std; 

void reverseString(char* first, char* last) 
{ 
    while(first < last) 
    { 
     cout << *first << " " << *last << endl; //for debugging; prints 'H' and 'o' then crashes 
     char temp = *last; 
     *last = *first; //this line crashes the program 
     *first = temp; 
     first++; 
     last--; 
    } 
} 

int main() 
{ 
    char* s = "Hello"; 
    reverseString(s, s + strlen(s) - 1); 
    cout << s << endl; 
} 

Cependant, je vais avoir du mal à échanger la les valeurs auxquelles les pointeurs pointent. Je pensais que * p = * p1 devrait simplement mettre la valeur pointée sur p à la valeur pointée de p1, mais quelque chose semble buggé. Merci d'avance pour votre aide!

+3

Si vous n'avez pas besoin de l'implémenter vous-même, préférez 'std :: reverse'. – chris

+0

Je sais, mais j'aimerais vraiment savoir pourquoi ça ne marche pas comme je l'ai fait. Merci pour le conseil, au fait. – tomKPZ

+3

Vous modifiez un littéral de chaîne. – chris

Répondre

7

Le code me semble bien. Le problème le plus probable est que le compilateur est autorisé à supposer que les littéraux de chaîne ne sont pas modifiés, il peut donc les mettre en mémoire en lecture seule. Essayez plutôt

char s[] = "Hello"; 

dans main(), ce qui crée une copie inscriptible de la chaîne littérale.

+0

Cela a fonctionné, merci! Je n'ai jamais entendu parler de la mémoire en lecture seule. – tomKPZ

0

Le fichier d'en-tête pour strlen() est manquant. En second lieu, il lance un avertissement - Conversion obsolète de la chaîne de caractères en char *, la solution de @ j_random_hacker semble prendre en charge ce problème.

1

Une solution alternative à @j_random_hacker:

char* buffer = new char[32]; 
strcpy(buffer, "Hello"); 
reverseString(buffer, buffer + strlen(buffer) - 1); 

... rest of your program ... 

delete[] buffer; 

Cette mémoire pour correctement alloue une chaîne C de style qui peut ensuite être modifié par une fonction. Bien sûr, vous devez inclure <string.h> en-tête pour accéder à strcpy et strlen.

+0

Je voudrais +1, mais le fait que vous disiez "allouer correctement" suggère que l'utilisation d'un tableau local sur la pile (comme je l'ai proposé) est en quelque sorte "impropre": -P –

+0

Ce n'est pas le cas. Je me sens tout chaud et flou sachant que je décide quand mes tableaux seront dé-alloués! :) – Zeenobit