Question

J'ai essayé de réinventer la fonction strcpy C, mais lorsque je tente de l'exécuter je reçois cette erreur:

Unhandled exception at 0x00411506 in brainf%ck.exe: 0xC0000005: Access violation writing location 0x00415760.

L'erreur se produit dans la ligne de *dest = *src;. Voici le code:

char* strcpy(char* dest, const char* src) {
    char* dest2 = dest;
    while (*src) {
        *dest = *src;
        src++;
        dest++;
    }
    *dest = '\0';
    return dest2;
}

EDIT: Wow, c'était rapide. Voici le code d'appel (strcpy est défini dans mystring.c):

#include "mystring.h"
#include <stdio.h>

int main() {
    char* s = "hello";
    char* t = "abc";
    printf("%s", strcpy(s, t));
    getchar();
    return 0;
}
Était-ce utile?

La solution

char* s = "hello";
char* t = "abc";
printf("%s", strcpy(s, t));

Le compilateur placé votre tampon de destination, s, dans la mémoire en lecture seule, car il est une constante.

char s[5];
char* t = "abc";
printf("%s", strcpy(s, t));

devrait résoudre ce problème. Ceci affecte le réseau de destination sur la pile, qui est accessible en écriture.

Autres conseils

Le problème potentiel évident est que votre tampon de sortie n'a pas assez de mémoire allouée, ou que vous avez passé à NULL pour dest. (Probablement pas pour src ou il aurait échoué sur la ligne avant.)

S'il vous plaît donner un programme court mais complet pour reproduire le problème, et nous pouvons vérifier ...

Voici un exemple qui va bang pour moi sur Windows:

#include <stdlib.h>

char* strcpy(char* dest, const char* src) {
    char* dest2 = dest;
    while (*src) {
        *dest = *src;
        src++;
        dest++;
    }
    *dest = '\0';
    return dest2;
}

void main() {
    char *d = malloc(3);
    strcpy(d, "hello there this is a longish string");
}

Notez que dans ce cas, je devais dépasser la mémoire allouée réelle d'un montant juste avant que je puisse provoquer le programme à mourir - juste « bonjour » ne tombe pas en panne, mais il pourrait certainement en fonction de divers aspects du compilateur et l'environnement d'exécution.

Votre strcpy () est très bien. Vous écrivez à la mémoire en lecture seule. Voir cette description .

Si vous aviez écrit cela, vous seriez bien:

#include "mystring.h"
#include <stdio.h>

int main() {
    char s[] = "hello";
    char t[] = "abc";
    printf("%s", strcpy(s, t));
    getchar();
    return 0;
}

Il y a un problème avec l'appel de votre routine strcpy réinventé dans la routine principale, à la fois tableau de caractères:     char * s = "bonjour";     char * t = "abc"; atterrira dans la mémoire LISEZ seul segment au moment de la compilation. Comme vous essayez d'écrire dans la mémoire pointée par s dans la strcpy routine, et comme il pointe vers un emplacement dans un seul segment READ, il sera pris, et vous aurez une exception. Ces chaînes sont en lecture seule!

Assurez-vous dest a sa mémoire allouée avant d'appeler cette fonction.

Probablement un problème avec l'appelant: Avez-vous vérifié la dest pointeur? Est-il à quelque chose valide pointer ou tout simplement des ordures? En outre, le moins que vous puissiez faire est de vérifier pour les pointeurs nuls, comme si (! Dest ||! Source) {/ * faire quelque chose, comme NULL de retour ou lancer une exception * /} sur l'entrée de fonction. Le code semble correct. Pas très sûr, mais OK.

Il y a plusieurs erreurs.

  1. Vous n'allouez pas un tampon de retour qui peut contenir la chaîne copiée.
  2. Vous ne vérifie pas si src est nul avant d'utiliser * src
  3. Vous êtes tous les deux Tring pour obtenir la réponse dans un paramètre et renvoie la valeur. Effectuez l'une ou l'autre.
  4. Vous pouvez facilement dépasser la mémoire tampon de dest.

Bonne chance.

chaque fois que l'exécution de départ de code (Généralement il commence à partir de la fonction principale). Ici, le moyen de code séquence de execution.so, lorsque le processus (séquence d'exécution) démarre, est créé le PCB (bloc de contrôle de processus), le circuit imprimé ayant infromation sur le processus semblable à l'espace d'adressage du processus, la pile kernal, table OFDT comme ceci .

dans votre code

  

char * s = "bonjour";
      char * t = "abc";

est ce que vous avez pris des entrées de deux chaînes comme celui-ci.

ici, les cordes (ce qui signifie double guillemet) qui sont présents dans la section texte de l'espace d'adressage du processus. ici la section de texte est celui de la section qui est présente dans la section de l'espace et le texte adresse processus n'ayant les autorisations de lecture seule. c'est pourquoi, lorsque vous essayez de modifier la chaîne de source / chaîne de destination, nous ne devons pas permis de changer les données quelle que soit présente dans le texte setion. donc, c'est ce que la raison de votre code, vous devez être prudent. J'espère que tu as compris.

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