Pergunta

Eu tentei reinventar a função strcpy C, mas quando eu tentar executá-lo eu recebo este erro:

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

O erro ocorre na linha *dest = *src;. Aqui está o código:

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

EDIT: Uau, isso foi rápido. Aqui está o código de chamada (strcpy é definida em mystring.c):

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

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

Solução

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

O compilador colocado o seu buffer de destino, s, na memória só de leitura, uma vez que é uma constante.

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

Se corrigir esse problema. Isso aloca a matriz destino na pilha, que é gravável.

Outras dicas

O problema potencial óbvia é que o buffer de saída não tem memória suficiente alocada, ou você passou em NULL para dest. (Provavelmente não para src ou ele teria falhado na linha antes.)

Por favor, dar um curto, mas completo programa para reproduzir o problema, e podemos verificar ...

Aqui está um exemplo que vai estrondo para mim no 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");
}

Note que neste caso eu tive que exceder a memória real alocada por uma quantidade razoável antes que eu pudesse provocar o programa de morrer - apenas "Olá" não caiu, embora certamente poderia, dependendo de vários aspectos do compilador e execução ambiente.

Seu strcpy () é muito bem. Você está escrevendo a memória só de leitura. Veja esta descrição aqui .

Se você tivesse escrito isto, você estaria bem:

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

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

Há um problema com a chamada de sua rotina strcpy reinventada na rotina principal, tanto array de caracteres: char * s = "Olá"; char * t = "abc"; vai pousar na memória READ ONLY segmento em tempo de compilação. Como você está tentando escrever para a memória apontada por s na strcpy rotina, e uma vez que aponta para um local em um só de leitura segmento, ele vai ser pego, e você terá uma exceção. Essas seqüências são READ ONLY!

Certifique-se de dest tem a sua memória alocada antes de chamar essa função.

Provavelmente um problema com o chamador: o senhor checou o dest ponteiro? Será que ela apontar para algo válido ou apenas lixo? Além disso, o mínimo que poderia fazer é cheque de ponteiros nulos, como if (! Dest ||! Source) {/ * fazer algo, como NULL retorno ou lançar uma exceção * /} em função de entrada. O código parece OK. Não é muito seguro, mas OK.

Existem vários erros.

  1. Você não alocar um buffer de retorno que pode segurar a corda copiado.
  2. Você não verificar para ver se src é nulo antes de usar * src
  3. Você está tanto tring para obter a resposta em um parâmetro e retornar o valor. Fazer um ou outro.
  4. Você pode facilmente saturar o buffer dest.

Boa sorte.

sempre que o código de iniciar a execução (generaly ele começa a partir função principal). aqui a seqüência de meios de código de execution.so, quando o processo (seqüência de execução) começa, o PCB (bloco de controle de processo) é criada, o PCB tendo infromation completas sobre o processo de como o espaço de endereço do processo, pilha kernal, OFDT tabela como esta .

em seu código

char * s = "Olá";
char * t = "abc";

este é o que você tem tomado as entradas de duas cordas assim.

aqui, as as cordas (que significa o dobro cotadas) que estão presentes na seção de texto do espaço de endereços do processo. aqui seção de texto é a da seção que está presente na seção de espaço de endereço processo e texto só ter as permissões de somente leitura. é por isso que quando você tentar modificar a cadeia de origem corda / destino, não devemos permitido para mudar o que quer que os dados estão presentes no setion texto. assim, isso é o que a razão para o código que você precisa para ser cauteloso. eu espero que você entenda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top