C로 된 소스를 보다 보면 배열 선언 후 초기화 시키는 꼴이 일반적으로 세 경우로 나눠진다.

1. int a[10] = { 0 };

2. int a[10] = { 0, };

3. int a[10];
   memset ( a, 0, 10 );


나는 아주 예전부터 1번으로 사용을 해왔다.
해당 배열을 사용하다가 중간에 reset이 필요한 경우에는 중간 중간에 memset을 사용하기도 하지만
선언 후 초기화는 1번을 잘 이용해 왔다.

그러던 중..
1번이 아닌 2번으로 해야되는게 아니냐는 지적을 받았다.
차이점이라고는 , 있고 없고의 차이인데
나는 콤마의 유무가 배열 초기화에는 전혀 지장을 주지 않는다고 굳게 믿고 있었으나
몇 명의 주변 사람들에게 문의해 본 바
의외로 아래와 같이 믿고 있는 사람들이 꽤 있었다.

int a[10] = { 0 };
=  a[0] = 0,  a[1] ~ a[9] = not initialized   두둥!!!! 과연???


int a[10] = { 0, };
=  a[0] ~ a[9] = 0


괜한 자존심의 상처라고나 할까...
아님
이제껏 내가 생성해냈던 초기화도 제대로 안된 배열들이
유럽 어느 누군가의 휴대폰에서 동작하고 있을지도 모른다는 불안감 때문일까..

찾아보자라는 강한 의욕이 생기기 시작했다.
아래 꽤 저명한 사이트에서 배열 초기화에 대해서 언급한 것을 살펴보자면..

refered by
http://www.devx.com/Gethelpon/Article/16039/0/page/2

When initializing an array, you are allowed to use fewer initializers than the number of its elements (the opposite, however, is forbidden).
It is guaranteed that the remaining elements are default-initialized in this case. For example, in the following expression, the array num has five elements but only the first three have explicit initializers:

int num[5]={0,1,2};
The elements num[4] and num[5] are automatically initialized to 0 in this case. 
짜잔 +_+
Thus, to zero-initialize a large array you can provide a single initializer
and let the compiler take care of the rest:
즉, compiler가 알아서 다 0으로 초기화를 해 준다는 말인데.. 콤마 유무는 아무런 언급이 없넹.
double results[500]={0.0}; //the remaining 499 elements are initialized to 0.0 as well
This form has the same effect: 
double results[500]={0};
Or,
if you're using a char array:
char URL[2048]={0}; //all elements are initialized to '\0'

memset 초기화가 얼마나 구찮은 건지에 대한 설명 시작
Notice how cumbersome and error prone a memset() call looks in comparison:
#include <cstring> char URL[2048]; memset(URL, 0, 2048);
Not only do you need to #include a special header,
this form also presents a serious maintenance problem if the size of the array changes in the future. Worse yet, programmers tend to confuse between the second and third arguments:



내 앞자리 앉은 농땡이 사원 전 모군이( 누군지는 여길 클릭해서 알아보자
http://book.naver.com/bookdb/book_detail.php?bid=119381 )
,내 주변에서 C언어 문법에 관한 최고라 믿고 싶은 1인, 표준안을 제시하며 조목조목 설명을 해준걸 덧붙히자면,

===========================================================================================
If an object that has static storage duration is not initialized explicitly,
then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
if it is an aggregate, every member is initialized (recursively) according to these rules;
— if it is a union, the first named member is initialized (recursively) according to these rules.
 
aggregate 에는 array 랑 struct 포함이요. array 각 element 마다 그 위 2가지 룰이 재귀적으로 적용된다는...
 
글고.. local 일 경우에는...
If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
 
초기치 개수가 더 적으면 나머지는 static 인것처럼 초기화된다고...
그래서 저 위에 규칙에 따라 재귀적으로 0 으로 초기화요...
 
마지막 comma 에 대한 이야기는 따로 말로 하지 않고 BNF 문법에만 들어가있어요.
말 그대로 컴파일러는 의미 없이 문법적으로만 처리하고 사람한테만 의미있다는 이야기죠...
 
심지어는...
    int a[5] = { 1, 2, 3, 4, 5, };
 
이런애도 마지막 , 를 무시해 버리죠
===========================================================================================


고로 내가 하는 방법이 틀린게 아닌, 아니지 사용을 권장하는 방법이란 말인데
글면 초기화 할때 ,(콤마)를 찍는건 왜 일반화 되었을까??

단지 아래 사항과 같은 경우를 대비해 가독성을 높이기 위함인가??

int a[5] = { 1 };
이렇게 초기화를 시도했을때
실제로는 a[0]만 1, a[1] ~ a[4] = 0으로 초기화가 되나
얼핏 보면  a[0] ~ a[4] = 1 이라고 생각해버리기가 쉽다.

그래서
int a[5] = { 1, } <--- 이렇게 ,(콤마) 를 줌으로 딸랑 한 개만 1로 초기화되고 나머지는 0으로
초기화 된다는 걸 분명히 표시함이 아닌가??

원문 : http://jepo.tistory.com/entry/C-배열-초기화

'Programming Language > c언어' 카테고리의 다른 글

C언어 메모리 구조  (0) 2011.03.02
[스크랩] unistd.h execve함수  (0) 2010.11.16
헝가리안 표기법의 장단점  (0) 2010.08.26
[스크랩] xor ^  (0) 2010.01.25
논리연산자  (0) 2010.01.25

+ Recent posts