▸C언어/개발 TIP

Debug 모드에서 sprintf_s() 함수 사용 시 주의사항

코데방 2019. 12. 5.
728x90

문자열(String) 작업을 하다가 sprintf_s() 함수를 써서 붙이고 진행하는데 계산이 꼬이는 문제가 발생해서 이것저것 해보다보니 신기한게 보여서 정리합니다.

 


 

예를 들어 아래 코드를 Debug 모드에서 실행했을 때 결과입니다.

분명 char* str에 할당된 공간을 모두 '\0'값으로 초기화 시켜줬음에도 불구하고 공백이 생겨납니다.

 

void main()
{

	char* str = (char*)malloc(sizeof(char) * 30);
	/* 초기화 */
	for (int i = 0; i < 30; ++i)
		str[i] = '\0';

	printf("\n\n ");
	
	int a = 1;
	sprintf_s(str, sizeof(int), "%d", a);
	*(str + strlen(str)) = 'a';
	
	for (int i = 0; str[i] != '\0'; ++i)
		printf("%c", str[i]);

	printf("끝\n");
}

 


 

해당 메모리를 살펴보면 'fe' 라는 이상한 값이 추가돼있는걸 알 수 있습니다.

 

sprintf_s() 함수를 사용할 때 추가할 문자열 크기를 'sizeof(int) == 4byte'로 뒀기때문에 처음 한 칸에 1을 넣고 나머지 세 칸에 fe라는 값이 들어가게 됩니다.

원래라면 최대 사이즈 내에서 필요한만큼만 저장하고 나머지는 그대로 두는 함수이지만, Debug모드에서는 저렇게 자신이 써야할 공간을 'fe'라는 것으로 채워서 디버깅하기 좋게 만들어 준다고 하네요. 할당된 만큼 쓰고 나머지는 메모리를 반환했다라는 의미에서 free를 써두고 싶은데 16진수를 벗어나서 못쓰니까 그냥 fe라고 표시한다는 의견도 있습니다.

어쨌든 저 'fe'의 의미는 내가 4byte를 받아서 사용하고나서 남은 메모리는 다시 놔줬다(free)라는 의미라고 합니다. 디버깅 시 보기 편하게요.

그런데 문자열을 한글자씩 조작하면서 수식을 계산하거나 할 때는 저 'fe'라는 녀석때문에 계산이 꼬여서 찾느라 애를 좀 먹었습니다. 이 경우 마지막에 조작한 문자 다음에 무조건 '\0'값을 넣어줘서 문자열의 끝을 찍어주긴 했는데 굳이 불필요해보이는 수식이라 찝찝하네요. 그래도 Debug 모드에서는 어쩔 수가 없나봅니다.

str[2] = '\0';	// 추가

 

 


 

 

같은 수식을 Release 모드에서 실행시켜보면 정상 작동 합니다.

 

 

 

위와 같이 Release 모드에서는 다른 값은 건드리지 않고 필요한만큼만 입력하고 끝내고 있네요. 디버깅할 때 'fe'값이 나와서 계산이 꼬이는 경우 알아두면 금방 해결할 수 있을 것 같습니다~!

728x90

댓글

💲 추천 글