2011-03-21 5 views
0

Programme de test qui provoque un signal EXC_BAD_ACCESS. Pourquoi cela provoque-t-il une erreur de bus? Je veux changer le 'HI' en 'fI'.Erreur de bus sur Intel Mac, pourquoi?

//BUS ERROR TEST 

#include <iostream> 

void test(char *text) 
{ 
    text[0] = 'f'; 
} 

int main() 
{ 
    char *text = (char *)"HI"; 
    test(text); 
    std::cout << text << std::endl; 
    return 0; 
} 

Répondre

5

Vous n'êtes pas autorisé à modifier les constantes de chaîne, c'est un comportement non défini selon la norme.

Si vous remplacez:

char *text = (char *)"HI"; 

avec quelque chose comme:

char text[3]; 
strcpy (text, "HI"); 

ou:

char text[] = "HI"; 

vous verrez que cela fonctionnera, parce text dans ce cas est mémoire modifiable.

1

Vous ne devez pas éliminer const, c'est UB. Les constantes de chaîne sont en lecture seule, de sorte que le compilateur est autorisé à les mettre en mémoire en lecture seule.

Utilisez

char text[] = "Hi!"; 

pour obtenir une chaîne modifiable.

0
char *text = (char *)"HI"; 
text[0] = 'f'; 

Ceci est en fait contraire à la norme C++. Les chaînes citées sont déclarées const pour une raison. Dans votre cas, il stocke probablement la chaîne dans le cadre de vos "données de code" plutôt que des "données" régulières. Ceci, combiné avec l'utilisation courante de la lecture de la zone "données de code", fait en sorte que vous ne serez pas capable d'écrire dans des chaînes constantes.