Question

Je suis en train de faire un peu de développement C classique dans Visual C ++ 2008 qui modifiera les caractères d'une chaîne comme ceci:

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

Je reçois une exception non gérée lorsque je tente de changer un caractère. Il semble que je pourrais le faire dans Visual Studio 6 ou en utilisant gcc, mais peut-être que je suis juste oublier quelque chose. Est-ce que Visual Studio passe en quelque sorte char * en valeur (gestion de la mémoire). Si oui, comment puis-je désactiver cette?

Était-ce utile?

La solution

Vous probablement passer une chaîne littérale quelque part:

ModifyString("oops");  // ERROR!

C et C ++ vous permettent de manière implicite coulée à partir littéraux de chaîne (qui ont le type const char[]) à char*, mais cette utilisation est dépréciée. Les constantes de chaîne sont autorisés à allouer à la mémoire en lecture seule (et ils sont en général), donc si vous essayez de les modifier, vous aurez une violation d'accès (aka défaut de segmentation ou erreur de bus). Si le compilateur ne les constantes de chaîne pas mis en mémoire en lecture seule, le programme fonctionne toujours, mais il est un comportement non défini.

La bonne façon de le faire est de copier la chaîne dans un tampon inscriptible:

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok

Autres conseils

L'entrée d'une chaîne littérale? C'est probablement le problème. Sinon, vous devrez poster plus de code, comme le pointeur est en quelque sorte fini par pointer à un endroit dans la mémoire en lecture seule.

Il est impossible de répondre à cette question sans voir comment ModifyString est appelé. La fonction elle-même est correcte en supposant qu'il est un contrat doit être passé une valeur non NULL.

Cependant, il est possible pour le site d'appel à l'échec en faisant un certain nombre de choses

  • NULL passage
  • Passing const char au moyen d'une distribution mal

Je ne peux pas dire exactement pourquoi cela ne fonctionne pas, mais le problème est dans votre code, pas Visual Studio. Pour une raison quelconque, vous passez un pointeur invalide à la fonction. Il est soit un pointeur NULL, ou pointe vers une adresse que vous ne l'avez pas lu l'accès à.

Si vous publiez un peu plus du code (où est la fonction appelée, et comment est-il appelé?), Nous pouvons être en mesure de signaler le problème exact.

La raison pour laquelle il a travaillé dans GCC ou VC6 est tout simplement qu'il est un comportement non défini. La norme C de ne dit pas que « cela devrait fonctionner », ou « cela devrait provoquer un accident ». Tout peut arriver si vous écrivez à la mémoire que vous n'avez pas accès. Et selon le compilateur et le système que vous exécutez l'application sur, l'adresse que vous finissez par variera accédant. Par pure chance, vous frappez une adresse qui a causé une violation d'accès lors de la compilation avec VC2008. Sous GCC et VC6, vous n'êtes pas aussi chanceux, et a obtenu le code qui a semblé travailler , et simplement écrit à quelque adresse des déchets.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top