-
memset을 이용한 초기화 문제Coding/Tip !! 2019. 2. 8. 15:03
네트워크 코딩을 하다보면 memset을 이용하는 일이 자주 생긴다.
(물론 다른 코딩에서도 많이 쓰일거라고 생각한다)
하지만 이러한 memset을 사용할 때 주의할 점들이 있다.
바로 1Byte 변수(uint8_t, char, unsigned char 등)이 아닌 변수들을 초기화할 때
0의외의 값을 사용하면 안된다는 점이다.
그 이유는 만약 4Byte 변수인 int형을 memset으로 초기화하게되면
바이트 단위로 초기화가 처리되어
00000001 00000001 00000001 00000001 이 되버려서 값이 0이아닌 다른 수가 되어버린다.
또한 new, malloc 등을 이용한 동적으로 생성한 배열, 변수가 있는
struct, class에서는 memset을 이용한 초기화를 해주면 안된다.
예를 들어 다음과 같은 코드가 있다.
위의 코드에서 sizeof(test)는 int의 4Byte와
char *c의 address(pointer)크기로 4Byte(32bit OS 기준)
4Byte + 4Byte로 8Byte가 된다.
(참고로 pointer변수의 크기는 운영체제의 비트마다 다름)
(32bit = 4Byte, 64bit = 8Byte)
그렇기 때문에 위의 소스에서 동적으로 만들어준 배열의 변수는 제대로 초기화 되지 못한다.
또한 char*b의 경우 NULL로 초기화가 됨으로
이전에 생성한 메모리는 메모리 누수가 발생한다.
그러므로 struct 통째로 한번에 초기화하려고하면 안된다.
그러므로 이런경우에는 동적으로 생성한 경우에는 분리하여 초기화하야야 한다.
반응형'Coding > Tip !!' 카테고리의 다른 글
Visual Studio 2017 C# 스크립트 에러 (0) 2018.10.12 자료형 크기와 범위 코딩하기 (0) 2018.10.03 변수 초기화 방법 (0) 2018.10.03 매크로 함수 (0) 2018.10.03 Header Gurad (0) 2018.10.02 댓글