문제

strcpy C 함수를 다시 만들어 보았으나 실행하려고 하면 다음 오류가 발생합니다.

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

에서 오류가 발생합니다. *dest = *src; 선.코드는 다음과 같습니다.

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

편집하다:와, 빨랐어요.호출 코드는 다음과 같습니다(strcpy는 mystring.c에 정의되어 있음).

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

int main() {
    char* s = "hello";
    char* t = "abc";
    printf("%s", strcpy(s, t));
    getchar();
    return 0;
}
도움이 되었습니까?

해결책

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

컴파일러는 대상 버퍼 (s)를 일정하기 때문에 읽기 전용 메모리로 배치했습니다.

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

이 문제를 해결해야합니다. 이것은 스택의 대상 배열을 할당하여 쓸 수 있습니다.

다른 팁

명백한 잠재적 문제는 출력 버퍼가 메모리가 충분하지 않거나 NULL로 통과했다는 것입니다. dest. (아마도 src 아니면 이전에 라인에서 실패했을 것입니다.)

문제를 재현 할 수있는 짧지 만 완전한 프로그램을 제공하면 확인할 수 있습니다.

다음은 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");
}

이 경우 프로그램을 죽이는 것을 자극하기 전에 실제 할당 된 메모리를 공정한 금액으로 초과해야했습니다. 컴파일러 및 실행 환경의 다양한 측면에 따라 "Hello"만 충돌하지 않았습니다.

당신의 strcpy ()는 괜찮습니다. 당신은 읽기 전용 메모리에 글을 쓰고 있습니다. 이 설명을 참조하십시오 여기.

이것을 썼다면 괜찮을 것입니다.

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

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

메인 루틴에서 재창조된 strcpy 루틴을 호출하는 데 문제가 있습니다. 두 문자 배열 모두 다음과 같습니다.char* s = "안녕하세요";char* t = "abc";컴파일 타임에 메모리 READ ONLY 세그먼트에 저장됩니다.루틴 strcpy에서 s가 가리키는 메모리에 쓰려고 하면 READ ONLY 세그먼트의 위치를 ​​가리키므로 해당 메모리가 포착되고 예외가 발생합니다.이 문자열은 읽기 전용입니다!

해당 기능을 호출하기 전에 Dest에 메모리가 할당되었는지 확인하십시오.

아마도 발신자와의 문제 : 당신은 데스트 바늘? 유효한 것이 있습니까 아니면 단지 쓰레기를 가리키나요? 게다가, 당신이 할 수있는 가장 적은 것은 if (! dest ||! source) { / * 함수 항목에서 return null 또는 예외 * /}와 같은 무언가를하는 것과 같은 널 포인터를 확인하는 것입니다. 코드는 괜찮아 보입니다. 그다지 안전하지는 않지만 괜찮습니다.

몇 가지 오류가 있습니다.

  1. 복사 된 문자열을 보유 할 수있는 리턴 버퍼를 할당하지 않습니다.
  2. *SRC를 사용하기 전에 SRC가 Null인지 확인하지 않습니다.
  3. 둘 다 매개 변수로 답을 얻고 값을 반환하기 위해 트링됩니다. 하나 또는 다른 사람을하십시오.
  4. Dest 버퍼를 쉽게 오버런 할 수 있습니다.

행운을 빕니다.

코드가 시작될 때마다 실행을 시작할 때 (Generaly는 기본 함수에서 시작). 여기서 코드는 실행 시퀀스를 의미합니다. 따라서 프로세스 (실행 시퀀스)가 시작되면 PCB (프로세스 제어 블록)가 생성되고 PCB는 프로세스 주소 공간, 커너 스택, OFDT 테이블과 같은 프로세스에 대한 완전한 인프라를 갖습니다. .

코드에서

char* s = "안녕하세요";
char* t = "abc";

이것은 당신이 이와 같은 두 줄을 입력 한 것입니다.

여기서는 프로세스 주소 공간의 텍스트 섹션에 존재하는 문자열 (이중 인용문)입니다. 여기서 텍스트 섹션은 프로세스 주소 공간 및 텍스트 섹션에있는 섹션 중 하나입니다. 그렇기 때문에 소스 문자열/대상 문자열을 수정하려고 할 때 텍스트 설정에있는 모든 데이터를 변경할 수 없습니다. 따라서 이것이 코드의 이유가 조심 해야하는 이유입니다. 당신이 이해하기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top