2010-11-25 6 views
2

J'ai un programme que je vous écris pour uni en C, et quand mon code atteint cette ligne:EXC_BAD_ACCESS Lorsque vous essayez d'effectuer une strcat fonction en C

strcat("md5 ", "blah"); 

Je reçois une erreur de EXC_BAD_ACCESS, et mon application des accidents. Pour autant que je sache, il n'y a rien de mal à cela, alors j'ai pensé qu'une nouvelle paire d'yeux pourrait résoudre mon problème. Des idées?

+1

Essayez d'activer les avertissements pour votre compilateur. – Anycorn

+0

Les avertissements peuvent être activés avec '-Wall' si vous utilisez GCC. Malheureusement, il ne met pas en garde contre cette erreur. –

+1

@lars '-Wwrite-cordes' – Anycorn

Répondre

8

Vous essayez de modifier une chaîne constante. Le premier argument de strcat est également la chaîne de destination et dans votre cas c'est une chaîne constante. Vous devez utiliser quelque chose comme:

char s[100]; 
strcpy(s, "md5 "); 
strcat(s, "blah"); 
1

La première chaîne fournie à strcat doit être un tampon inscriptible avec suffisamment d'espace pour la deuxième chaîne passé son contenu actuel. Cela signifie que ne peut pas utiliser des littéraux de chaîne comme premier argument de strcat()!

1

Selon http://www.cplusplus.com/reference/clibrary/cstring/strcat/:

une copie de Ajoute la chaîne source à la chaîne de destination. Le caractère nul final dans la destination est remplacé par le premier caractère de la source, et un nouveau caractère nul est ajouté à la fin de la nouvelle chaîne formée par la concaténation des deux dans la destination.

Puisque votre première chaîne est une constante, vous ne savez pas où elle se trouve en mémoire et vous n'êtes pas autorisé à jouer avec la mémoire qui la suit.

3

En C, vous devez fournir l'espace d'où stocker vous-même quelque chose. "md5" a seulement de la place pour 4 caractères (+ un terminateur nul). Il n'y a pas assez d'espace pour ajouter "bla" là.

Plus important encore, vous ne pouvez pas modifier un littéral de chaîne. Ils sont généralement en lecture seule. Ainsi, vous devez:

  • Fournir un stockage où vous pouvez stocker le nouveau résultat concaténé.
  • S'assure qu'il y a assez de place dans ce stockage pour la chaîne résultante.

.: par exemple

char result[9]; //the result here needs 8 characters + a nul terminator 
strcpy(result,"md5 "); 
strcat(result,"blah" 

Ou, par exemple

const char *a = "md5 "; 
const char *b = "blah"; 
char *result = malloc(strlen(a) + strlen(b) + 1); 
if(result == NULL) { 
    out of memory 
    return; 
} 
strcpy(result,a); 
strcat(result,b); 
+0

En fait, il ne s'agit pas vraiment d'espace libre. Il s'agit de chaînes constantes placées dans une page de mémoire en lecture seule dans cette implémentation. – kichik

+0

Il s'agit des deux, comme indiqué. – nos

Questions connexes