문제

Visual C ++ 2008에서 Classic C 개발을 수행하려고 노력하고 있습니다.

void ModifyString(char *input)
{
  // Change first character to 'a'
  *input = 'a';
}

캐릭터를 바꾸려고 할 때 도대치되지 않은 예외가 있습니다. Visual Studio 6에서 또는 GCC를 사용할 수있을 것 같지만 아마도 무언가를 잊어 버린 것 같습니다. Visual Studio가 어떻게 든 char*를 값으로 전달합니까 (메모리 관리). 그렇다면 어떻게 꺼져 있습니까?

도움이 되었습니까?

해결책

당신은 아마도 문자열을 어딘가에 통과 할 것입니다.

ModifyString("oops");  // ERROR!

C 및 C ++는 문자열 리터럴에서 암시 적으로 캐스트 할 수 있습니다 (유형이 있습니다. const char[]) 에게 char*, 그러나 그러한 사용은 더 이상 사용되지 않습니다. 문자열 상수는 읽기 전용 메모리에 할당 될 수 있으므로 (일반적으로 그렇습니다),이를 수정하려고하면 액세스 위반 (일명 세분화 오류 또는 버스 오류)이 나타납니다. 컴파일러가 문자열 상수를 읽기 전용 메모리에 넣지 않으면 프로그램이 여전히 작동하지만 정의되지 않은 동작입니다.

이를 수행하는 올바른 방법은 문자열을 쓰기 가능한 버퍼로 복사하는 것입니다.

// one way:
char mystring[] = "test";
ModifyString(mystring);  // ok

// another way:
char mystring[64];  // make sure this is big enough!!
strcpy(mystring, "test");
ModifyString(mystring);  // ok

다른 팁

입력은 문자열 문자물입니까? 아마 문제 일 것입니다. 그렇지 않으면 포인터가 어떻게 든 메모리의 준비된 위치를 가리키게되었으므로 더 많은 코드를 게시해야합니다.

ModifyString이 어떻게 호출되는지 보지 않고이 질문에 대답하는 것은 불가능합니다. 함수 자체는 계약이 널이 아닌 값을 전달한다고 가정 할 때 정확합니다.

그러나 여러 가지 일을함으로써 전화 사이트가 실패 할 수 있습니다.

  • 통과 null
  • 사악한 캐스트를 통해 Const Char를 통과합니다

이것이 왜 작동하지 않는지 정확히 말할 수는 없지만 문제는 시각적 스튜디오가 아닌 코드에 있습니다. 어떤 이유로 든, 당신은 기능에 대한 유효하지 않은 포인터를 전달하고 있습니다. 그것은 널 포인터이거나 액세스 할 수없는 주소를 가리 킵니다.

더 많은 코드를 게시하면 (기능은 어디에서 호출되고 어떻게 호출되는지), 정확한 문제를 지적 할 수 있습니다.

GCC 또는 VC6에서 작동하는 이유는 단순히 정의되지 않은 동작이기 때문입니다. C ++ 표준은 "이것이 작동해야한다"또는 "이것은 충돌을 일으킬 것"이라고 말하지 않습니다. 액세스 할 수없는 메모리에 편지를 쓰면 어떤 일이 발생할 수 있습니다. 컴파일러와 응용 프로그램을 실행하는 시스템에 따라 액세스하는 주소는 다릅니다. 운이 좋으면 VC2008로 편집 할 때 액세스 위반을 일으킨 주소를 쳤다. GCC와 VC6에서는 운이 좋지 않았고 코드를 얻었습니다. 작동하는 것처럼 보였습니다, 그리고 단순히 일부 쓰레기 주소에 편지를 썼습니다.

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