반응형
C/C++ 언어에서 배열을 초기화할 때 memset() 함수를 종종 사용한다
다음 memset() 함수는 for문으로 초기화하는 것과 거의 같은 코드이다
char x[500];
memset (x, 0, sizeof(x));
char x[500];
for(int i=0 ; i<500 ; i++) x[i] = 0;
컴파일러에 따라 다를 수 있겠지만,
어셈블리어로 분석해봐도 같은 코드임을 알 수 있다
하지만 memset() 함수를 사용할 때 주의할 점이 있다
memset()은 두 번째 인자로 주어진 값을 주어진 메모리의 모든 바이트에 채운다
이 인자는 unsigned char(1바이트; 8비트)로 해석되기 때문에,
255보다 큰 정수값을 집어넣게 되면 오버플로우가 일어나게 된다
만약 배열이 32비트나 64비트 정수형이라면,
각 바이트마다 값이 들어가기 때문에 엉뚱한 수로 초기화될 수 있다
0이나 -1을 채울 수 있는 이유도
각 바이트에 해당 숫자를 집어넣고 부호 있는 정수형으로 해석하면
운 좋게도 해당 숫자와 같아지기 때문이다
따라서 memset()으로 배열을 초기화하는 방법은 제한적인 경우에만 쓸 수 있음을 주의해야 한다
반응형
'etc.' 카테고리의 다른 글
파이참 이용하는데 code 9009 에러가 떠요 (0) | 2020.11.24 |
---|---|
return에 ||(논리 연산자)를 쓰면? (0) | 2020.11.03 |
갤럭시에서 음악 틀면서 영상 촬영하는 무료 어플 (0) | 2020.10.21 |
[Java] 사용자 정의 객체 정렬하기 Comparable과 Comparator 인터페이스 (3) | 2020.07.26 |
[백준 9095번][Java] 1, 2, 3 더하기 (0) | 2020.07.13 |