지역변수의 초기화 문제입니다.
글쓴이: ktd2004 / 작성시간: 목, 2006/01/26 - 6:59오후
새해 복 많이 받으세요..
헷갈리는 부분이 있어 확실히 하고자 질문드립니다.
질문은 다음과 같습니다. 다음 코드의 모든 변수는 지역변수입니다.
각 지역변수가 어떤 값으로 초기화되는지요?
int first[100]; // 1번. int second[100] = {3}; // 2번. int third[100] = {3,}; // 3번.
제 기억으로는(예전에 터보 C 완벽가이드에서 본 기억으로는)
1번 : 초기화되지 않음.
2번 : 초기화됨. 그런데 100개의 배열이 전체 다 초기화 되나요?
3번 : 초기화됨. 그리고 ","로 인해서 뒤쪽의 배열(99개)도 같은 값으로 최기화됨.
으로 알고 있었습니다.
그런데 테스트를 해보니(gcc -v 4.0.2)
1번 : 초기화되지 않음.
2번 : 배열의 첫번째 요소만 3, 나머지는 0으로 초기화됨.
3번 : 2번과 마찬가지로, 첫번째 요소는 3, 나머지는 0으로 초기화됨.
그래서 지역변수를 초기화하기 위해 다음과 같은 코드를 사용했습니다.
int first[100]; memset( first, 0, sizeof(first));
위 코드도 나름대로 괜찮은 것 같습니다.
그런데 0이 아닌 다른 값으로 초기화해야할 땐...
그래서 질문은 다음과 같습니다.
1. 위에서 언급한 3가지의 지역변수의 초기화방법에 대한 표준에서 정의된 결과는?
2. 배열 형태의 지역변수를 초기화(0 혹은 다른 값들)하는 가장 좋은 방법은?
저녁 맛있게 드십시오..
Forums:
결과부터 말씀드리면 GCC가 표준에 맞게 자기 일을 하는겁니다 -_-
결과부터 말씀드리면 GCC가 표준에 맞게 자기 일을 하는겁니다 -_-
1번 : 스택 지역변수면 성능 측면 땜시 초기화 안됩니다.
2번 : 정한데까지 초기화하고 나머지는 대략 기본생성자(즉 int() )로 초기화됩니다.
3번 : 2번과 같지만 끝의 콤마로 "이게 끝이 아니다"를 명시해주는, 일명 조은 코딩 스타일-_-
초기값 지정은 노가다 빼고는 방법이 없을 겁니다. -_-
위에 분이 적어주신 대로, gcc가 올바른 동작을 하고 있는 것입니다.
위에 분이 적어주신 대로, gcc가 올바른 동작을 하고 있는 것입니다. ','가 있건 없건 차이점은 없으며, 2번과 3번에 차이점은 없습니다.
0 외의 다른 값으로 모두 초기화를 시키는 방법은, 노가다로 다 적어주던가 혹은 for 문을 이용해서 일일이 써주는 방법밖에 없습니다.
C++이라면 템플릿을 이용한 뭔가 멋진 방법이 있을수도 있겠습니다만, 대신 코드의 크기는 무진장 커지겠지요.
template meta programming하면 code bloatin
template meta programming하면 code bloating 안생겨야 정상입니다.
컴파일 타임에 계산이 돼서 값으로 치환 되거든요.
template을 쓰려면 값에 재귀적으로 적용시킬 수 있는
규칙성이 있어야 합니다.
그런 규칙성이 없다면
코드 제너레이터를 만드세요.
댓글 달기