2010-07-15 3 views
3

내 코드의 일부는 char :복사 문자 * 여기 *

AccessViolationException:
Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

문제는 때문입니다 : 내가 외부 응용 프로그램에서이 함수를 호출 할 때 지금

extern "C" REGISTRATION_API int extreme(char* lKey) 
{ 
string s1; 
char *p=NULL; 
try 
{ 
    ifstream myfile ("extreme.txt"); 
    int i=0; 
    if (myfile.is_open()) 
    { 
    while (getline(myfile,s1)) 
     { 
     switch (i) 
     { 
     case 1: 
     strcpy(p,s1.c_str()); 
     lKey=p; 
     break; 
      //continue here 
     } 
     } 
    } 
} 

,이 오류가 발생합니다 이 :

lKey=p; 

가 어떻게 할당 할 수 lKeyp에?

+0

여기서 포인터 p에 메모리를 할당 했습니까? –

답변

8

을 (그리고 P 제거)합니다. 나는. p = new char[s1.length()+1];이 그것을 수행합니다 (종결 0 문자의 경우 +1). 그러나 아무런 이유없이 std::string과 C 문자열 루틴을 혼합하는 것은 좋지 않습니다. std::string을 사용하면 더 많은 문제를 해결할 수 있습니다.

또한 lKey=p도 작동하지 않습니다. p의 로컬 주소를 로컬 변수 lKey에 복사합니다. 호출자는 차이점을 보지 않습니다.

+0

p 수정을 수행하고 lkey에 할당하려면 어떻게해야합니까? : 나는 methodone (p)를 호출합니다. 그리고 난 lkey에 결과를 할당하고 싶습니다. 어떻게해야합니까? – Zee99

+0

안녕하세요 알렉산더, 나는 비슷한 문제에 직면하고 있으며 귀하의 답변이 유용하다고 생각합니다. 하나의 작은 질문이 있습니다. 두 번째 단락을 자세히 설명해 주시겠습니까? 호출자가 lkey에 새로운 값을 올바르게 수신 할 수 있도록 lKey = p 대신에 무엇이 필요합니까? 건배 – ibiza

+0

@ibiza : lKey는 호출자가 할당 한 버퍼가되어야합니다. 그러면 여러분은 그것을 strcpy 할 수 있습니다. 버퍼의 끝을 넘지 않도록주의하십시오. 또는, 대신에'char **'를 사용하고'malloc' 함수를 사용하여 문자열을 담을만큼 충분히 큰 버퍼를 만들 수 있습니다. –

10

p은 NULL 이외의 값으로 설정되지 않으므로 실제로 문제는 strcpy(p,s1.c_str());입니다.

+0

@ Zee99 strcpy는 데이터를 복사합니다. p는 할당되지 않은 메모리에 대한 포인터입니다. 따라서 복사 할 때 메모리 위치 0에 복사하는 것은 불법입니다. –

7

char*은 단지 메모리 위치의 주소라는 것을 기억하십시오. 주소에 메모리를 할당해야합니다.

코드에서 사용하기 위해 할당 된 메모리가없고 해당 메모리 주소를 가리 키도록 p를 설정하지 않았습니다.

strcpy 버퍼를 할당하지 않으면 데이터를 복사 할 때 메모리 주소 만 필요합니다.

당신이 함수에 버퍼를 통과하는 경우

은 그때는 아마 단순히이 당신은 당신이 strcpy에 전달 메모리를 미리 할당 할 필요가

strcpy(lKey, s1.c_str()); 
1
  1. 제거 페이지 ((여기가 아무것도하지 않고있다)로부터 데이터를 복사 S1 직접
  2. 당신을 이길 수 없음 LKEY 것이 아니라, 들여 쓰기 방식은 어디에서, 좋은 스타일 경찰 희화화하십시오이다 google 1tbs)