배열을 선언하며 초기화 할때
짚고 넘어가면 좋은 팁을 메모하고 가자.
-
초기화를 하지 않으면 당연히 쓰레기 값이 들어갈 위험 高
-
N개의 원소를 가지는 배열에 N보다 적은 갯수의 원소를 초기화 할 경우 나머지 원소가 자동 0으로 초기화
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h>
void main(void)
{
int i = 0;
int arr[10] = {1}; // 10개 원소중 첫 원소만 1로 초기화 함.
for( ; i < sizeof(arr) / sizeof(int); i++)
{
printf("arr[%d] : %d\n", i, arr[i]);
}
return;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
3. 콤마는 영향을 미치지 않음.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
#include <stdio.h>
void main(void)
{
int i = 0;
int arr[10] = {1, 2, 3, }; // 콤마가 포함된다면? 나머지는?
for( ; i < sizeof(arr) / sizeof(int); i++)
{
printf("arr[%d] : %d\n", i, arr[i]);
}
return;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
만약 arr[10] = {1, } 이라고 작성했다고치면
?? 콤마있으니까 나머지 원소도 1로 초기화 될것만 같은 착각을 불러 일으키고
실제로 나는 이 착각 때문에 삽질을...
4. 배열초기화 함수 memset의 함정
Interface | void * memset(void *ptr, int value, size_t num) |
Header | string.h // <cstring> in C++ |
Parameter |
ptr: 초기화할 배열의 주소 value: 초기화할 원소의 값 num: 초기화할 바이트 수 |
Function |
특정 배열의 원소를 원하는 값으로 초기화한다. ※단, 1바이트씩 값을 대입하는 식으로 초기화한다. |
다음 예제를 살펴보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <stdio.h>
#include <string.h>
int main(void)
{
int i = 0;
int arr[10];
memset(arr, 4, sizeof(arr));
for(; i < sizeof(arr) / sizeof(int); i++)
{
printf("arr[%d]의 값: %d\n", i, arr[i]);
}
return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter
|
당연히 모든 배열값이 '4'로 초기화될 줄 알았지만..
memset의 내부 구현을 들여다보면
'1바이트 단위'로 값을 입력한다고 되어있다.
현재 arr 배열에 대해 총 40바이트 (int형 4 * 10개 원소 )가 할당 되어있지만
매 int형 4바이트마다 16진수로 표현시
0x04040404 << 요놈을 1set(4byte)씩 10묶음..
이를 10진수로 표현하면?
때문에 memset함수는 주로 character형 한 문자 단위로 초기화 하는데 사용된다.
(∵ character형은 C에서 1byte단위로 저장& 표현되기 때문이다.)
'C > C' 카테고리의 다른 글
Memory Map 이해하기(Feat.성적처리 프로그램 소스) (0) | 2019.10.02 |
---|---|
2차원 배열 이해 (0) | 2019.09.29 |
성적 처리 프로그램 (분석->설계->구현) (0) | 2019.09.20 |
선택정렬 구현해보기 (feat. Flow Chart) (0) | 2019.09.17 |
calloc 함수 (0) | 2019.06.10 |