Violação de acesso ao usar strcpy?
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;
}
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.
- Você não alocar um buffer de retorno que pode segurar a corda copiado.
- Você não verificar para ver se src é nulo antes de usar * src
- Você está tanto tring para obter a resposta em um parâmetro e retornar o valor. Fazer um ou outro.
- 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.