Pregunta

Intenté reinventar la función strcpy C, pero cuando intento ejecutarla aparece este error:

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

El error ocurre en el *dest = *src; línea.Aquí está el código:

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

EDITAR:Vaya, eso fue rápido.Aquí está el código de llamada (strcpy está definido en mystring.c):

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

int main() {
    char* s = "hello";
    char* t = "abc";
    printf("%s", strcpy(s, t));
    getchar();
    return 0;
}
¿Fue útil?

Solución

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

El compilador coloca el búfer de destino, s, en memoria de sólo lectura, ya que es una constante.

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

En caso de solucionar este problema. Esto asigna la matriz de destino en la pila, que se puede escribir.

Otros consejos

El problema potencial obvio es que su buffer de salida no tiene suficiente memoria asignada, o ha pasado NULL para dest.(Probablemente no para src o habría fallado en la línea antes.)

Proporcione un programa breve pero completo para reproducir el problema y podremos comprobarlo...

Aquí hay un ejemplo que me resulta fantástico en 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");
}

Tenga en cuenta que en este caso tuve que exceder la memoria real asignada en una cantidad considerable antes de poder provocar la muerte del programa; simplemente "hola" no falló, aunque ciertamente podría hacerlo dependiendo de varios aspectos del compilador y el entorno de ejecución.

Su strcpy () está muy bien. Estás escribiendo a memoria de sólo lectura. Ver esta descripción aquí .

Si hubiera escrito esto, que estaría bien:

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

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

Hay un problema con llamar de su rutina strcpy reinventado en la rutina principal, tanto matriz de caracteres:     char * s = "Hola";     char * t = "abc"; aterrizará en la memoria LEA único segmento en tiempo de compilación. Como usted está tratando de escribir en la memoria apuntada por s en el strcpy rutina, y puesto que apunta a una ubicación en un único segmento LEER, que será capturado, y obtendrá una excepción. Estas cadenas son de sólo lectura!

Asegúrese de que ha dest que está asignada la memoria antes de llamar a esa función.

Probablemente un problema con la persona que llama: ¿verificó la dest puntero? ¿Apunta a algo válido o simplemente basura? Además de eso, lo menos que puedes hacer es comprobar si hay punteros nulos, como if (! Dest ||! Fuente) {/ * hacer algo, como NULL retorno o una excepción * /} en la entrada de la función. El código se ve bien. No es muy seguro, pero está bien.

Hay varios errores.

  1. Usted no asignar un búfer de retorno que puede contener la cadena copiada.
  2. Usted no comprueba si src es nulo antes de usar * src
  3. Se le tanto Tring para obtener la respuesta en un parámetro y devolver el valor. Realice una o la otra.
  4. Usted fácilmente puede desbordar el búfer dest.

Buena suerte.

cuando cada vez la ejecución del código de arranque (generaly se parte de la función principal). aquí el código significa secuencia de execution.so, cuando el proceso (secuencia de ejecución) comienza, se crea el PCB (bloque de control de proceso), la placa de circuito impreso que tiene infromation completa acerca del proceso como el espacio de direcciones del proceso, la pila kernal, mesa OFDT como este .

en el código

  

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

este es el lo que ha tomado entradas de dos cadenas como éste.

aquí, los de las cuerdas (que significa doble citado) que están presentes en la sección de texto del espacio de direcciones del proceso. aquí sección de texto es el de la sección que está presente en la sección de espacio de direcciones del proceso y de sólo texto que tiene los permisos de sólo lectura. es por eso que cuando se trata de modificar la cadena de cadena fuente / destino, no debemos permisible para cambiar los datos de lo que está presente en el setion texto. Por lo tanto, esto es lo que la razón de su código que necesita ser cauteloso. espero que entiendas.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top