memcmp 함수 사용시 발생할 수 있는 오류 및 실수

     




 두 개의 문자를 비교하는 것은 꽤 많이 사용되는 코드입니다. 보통은 (간단하게는) 두 개의 문자열을 비교하는 strcmp함수를 사용하지만, 포인터와 구조체를 많이 사용하는 규모가 있는 프로젝트에서는 strcmp보다는 메모리를 비교하는 memcmp를 더 많이 사용합니다. (물론 strcmp도 쓰긴 씀)


비교하는 함수가 여러가지다 보니까 사용법이 헷갈리고 실수를 하기도 하는데요, memcmp를 사용하면서 가장 많이 하는 실수가 인자값을 잘못 넣는 경우입니다. memcmp의 경우 다음과 같이 사용하는데요,


memcmp( 메모리1, 메모리2, 비교할 크기);


위와 같이 memcmp에 경우 입력값으로 "메모리"가 들어갑니다. 즉 포인터형이 들어가야한다는 것이죠, 


오늘 문자열을 비교하려고 memcmp를 사용하려 했는데 문자의 맨 앞자리를 때어내고 두 번째 자리부터 비교해야 할 경우가 발생했습니다. As-is버전의 코드는 다음과 같습니다.


memcmp( pdb->j_code[i], v_cd[j], 12) ==0;

i와 j값을 이중포문을 돌려서 두개의 문자열 12사이즈만큼 비교하는건데요, 맨 앞자리를 때고 두 번째 자리부터 비교하는 것이기 때문에 저는 이렇게 바꿨습니다.


memcmp( pdb->j_code[i][1], v_cd[j][1], 12) ==0;

 

위와같이 문자열변수의 두 번째 자리를 나타내기위해 뒤에 [1]을 붙였는데, 잘 돌아갈줄 알았던 코드가 멈추더라구요. 그래서 무엇이 문제인지 분석해본 결과 다음과 같이 바꿔야 올바른 방법이였습니다.


memcmp( (char*)&pdb->j_code[i][1], (char*)&v_cd[j][1], 12) ==0;

 

memcmp는 메모리를 받기 때문에 위와같이 포인터형으로 캐스팅을 해야합니다. 제가 처음 고쳤던 코드는 단순한 '문자'를 뜻하지 문자열의 주소를 듣하는게 아니더군요 ^^. strcmp와 같이쓰다보니 아무레도 memcmp는 많이 헷갈리는 것 같습니다. memcmp말고도 memcpy도 언제 앞에 &연산자를 붙여야 하고 *연산자를 붙여야하는지 항상 고민하죠 ^^..... 다 붙여보고 컴파일해서 돌아가는걸 선택하기는 하지만... 이기회에 메모리 연산자에 대한 정의를 확실히 공부하고 넘어가야겠습니다.

반응형

댓글

Designed by JB FACTORY