2017-10-06 12 views
-1

char 포인터 (예 : * pData)가 NULL로 초기화되지 않고 선언 된 코드 스 니펫을 발견했습니다. 역 참조 이전에 비 고유 포인터에 값 할당

char *pData, *pData2; 
char string[10] = "Hello" 
pData2 = &string[0]; 
SomeFuntionToAssignValue(pData2, &pData); 

SomeFuntionToAssignValue(char *pData2, char **pData) 
{ 
    if (something) 
    { 
     *pData = pData2; 
    } 
    else if (something) 
    { 
     *pData = &pData2[some calculation] 
    } 
} 

는 pData의이 시간의 어느 시점에, 기능 SomeFuntionToAssignValue()를 호출 한 후 "메모리 액세스 예외"오류가 발생 역 참조 할 수 있습니까?

컴파일 또는 로컬 테스트 (이 테스트는 언제든지 다시로드 할 수 있으므로 일반적으로 메모리 손상 가능성이 줄어 듭니다) 때문에 "메모리 액세스 예외"오류가 발생하지 않았습니다.

그러나 대상이 적어도 일주일 동안 다시로드되지 않은 필드 환경에서 테스트하는 동안 "메모리 액세스 예외"오류가 발생했습니다.

따라서 char *pData = NULL을 수행하지 않으면 "메모리 액세스 예외"오류가 발생할 수 있습니까?

+0

플랫폼, 아키텍처 및 컴파일러를 지정하지 않으면 C에 "메모리 액세스 예외"가 없습니다. –

+0

함수를 호출하는 방식으로 호출하면 호출 후에'pData'를 사용하는 것이 안전합니다. –

+1

@Someprogrammerdude - 일부 계산 결과가 범위 [0, strlen (pData2)]의 결과를 제공하는 경우 안전 –

답변

0

예, 귀하의 SomeFuntionToAssignValue이 아니기 때문에 항상*pData에 할당되어 있기 때문에 기회가 있습니다. 그리고 pData를 초기화하는 것은 가 다른 코드 힘이 NULL 확인 할 수 때문에 문제를 방지 할 수 있지만 초기화되지 않은 값을 확인 할 수 null이 될 수 있습니다. 하지만 그 모든 것은 여러분이 보여주지 않은 코드에 달려 있습니다. 일반적으로이 패턴에는 아무런 문제가 없습니다.