2012-11-29 3 views
0

나는 아마도 뭔가 바보 같은 짓을하고있을 것이다. 그러나 C++로 작업 한 이후로 얼마간은 sprintf가 호출 될 때 어떤 이유로 액세스 위반이 계속 발생했다.왜이 액세스 위반이 발생합니까?

char *value, *result; 
int len; 
result = ""; 
mgr.GetObjValue(0, value, len); 

for (int i = 0; i < len; i++) 
{ 
    sprintf(result, "%s %X", result, value[i]); 
} 

printf("ObjVal: %s\n\n", result); 

사람이 GetObjValue가 무엇을 궁금해하는 경우, 그것은 단지 내가 사용하고있는 API에서 SNMP 개체 값을 검색 : 어쨌든, 여기에 내가 사용하고 코드입니다. 어떤 도움이 많이 문제는 여기에있다

+1

사실 공간이 전혀 예약되어 있지 않습니다. 'result'는 정적 메모리를 가리 킵니다 ... – filmor

+0

@chris - 실제로는 하나의 문자가 아닙니다 - 결과는 매달려있는 포인터입니다. – user93353

+0

@filmor, 네가 맞아. 나는 똑바로 생각하지 않아. 한 문자라도 겹쳐 쓰는 것은 좋지 않습니다. – chris

답변

2

sprintf 메모리 할당을 수행하지 않습니다. 데이터를 저장하기에 충분한 길이의 쓰기 가능한 버퍼에 대한 포인터가 주어질 것으로 예상됩니다.

char *result; 

이 시점에서 결과의 내용은 정의되지 않습니다.

이 시점에서 결과는 정적 1 바이트의 읽기 전용 문자열 (종료 null)을 가리 킵니다.

sprintf(result, "%s %X", result, value[i]); 

이 시점에서 방금 크기가 1 인 읽기 전용 영역에 임의로 긴 문자열을 쓰려고했습니다.

이 대신 같은 것을 수행 snprintf 또는 sprintf_s를 사용하여 귀하의 버퍼를 덮어 쓰기도 가능성을 방지하는 것을

char result[1024]; 
sprintf(result, "%s %X", result, value[i]); 

주, 아마 좋은 생각이다. (C++을 사용하고 있기 때문에, 메모리 할당을 수행하는 Boost.Format과 같은 C++ 포맷 라이브러리 중 하나를 쉽게 사용할 수 있습니다. 그러나 전체적으로 다른 주제입니다.)

+1

그렇더라도 for 루프에서 각 반복은 마지막 반복을 덮어 씁니다. – user93353

+0

고마워요, 제가 말했듯이, 저는 무언가 바보 같은 짓을하고 있다고 확신했습니다. 메모리를 할당하는 것은 그리 좋지 않습니다. 고맙습니다. 자세한 답변은 – Brandon

0

주시면 감사하겠습니다

int SNMPMgr::GetObjValue(int iObjIndex, char *&lpObjValue, int &lenObjValue); 

: 당신은 상수 문자열 (빈 문자열)로 인쇄를 시도하고 char* result = "";

여기의 선언입니다. 첫 번째 매개 변수에 관한 sprintf 설명서에서 :

결과 C 문자열이 저장된 버퍼의 포인터. 버퍼는 결과 문자열을 포함 할만큼 충분히 커야합니다.

인쇄 할 버퍼를 할당해야합니다.

관련 문제