[완료]배열변수 초기화
글쓴이: kosti / 작성시간: 화, 2008/07/22 - 6:51오후
안녕하세요 이제 갓 프로그램계에 발 한쪽 들여놓은 초짜 프로그래머 kosti입니다^^
오늘 ELF 방식에 대한 소개와 데모를 준비하다가 갑자기 혼란이 와서 이렇게 글을 질문합니다^^
어렸을적 부터 배열변수를 초기화 할때 자주쓰던 방식이 있었습니다.
int a[8] = {1,};
이런식으로 쓰면 뒤에 남은 모든 공간은 다 1로 채워진다고 알고 있었으나 오늘 바이너리를 덤프해서 보니 전부 0으로 채워져 있더군요.
그래서 일단 C 표준 문서를 뒤적이니 STATIC 으로 선언된 배열과 채워지는 방식이 같다는 말이 있었습니다.
근데 이 녀석을 또 찾아보니 STATIC 초기화에 할 때 비워져 있는 공간에 대한 언급이 없어서...
컴파일러의 특성인가 하고 생각해 이번엔 ARM COMPILER 문서를 뒤적여 보고 있지만 초기화에 대한 언급은 별로 없네요.
^^ 그래서 질문이 있습니다^^
1. 일단 위에 방식을 썼을때 뒤에가 1로 채워지는 컴파일러가 있나요? 제 기억으론 존재했던거 같은데... 혹시 아시는분 있으시면 알려주세요.
2. 혹시 어떤 문서를 보면 그런것들이 명시가 잘되어 있을까요? 이런 문서를 보아라 하시면 제가 열심히 뒤적거려 보겠습니다.
이 부분에 대해서 괜히 얘기했다가 내일까지 리포트를 달라고 하셔서^^;; 하하하;;
부탁드립니다.!
Forums:
1. 0 으로 채워지는게
1. 0 으로 채워지는게 표준으로 알고 있으며 제가 써본 C 컴파일러들은 모두 0 으로 채워주었습니다.
2. C 언어 표준 문서(ISO/IEC 9899:1999 Programming Languages)를 보시라고 추천 드립니다.
6.7.8 Initialization 부분에서 원하시는 답을 찾을 수 있으리라 생각됩니다.
이 부분일듯 한데...
If an object that has automatic storage duration is not initialized explicitly, its value is
indeterminate. 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의 경우에는 every member가 these rules, 즉 pointer이면 어쩌구 arithmetic이면 어쩌구에 따라 초기화된다는 말인듯.
these rules라고 한 이유는 aggregate내에 aggregate나 union이 다시 들어 있을 수 있기 때문일 것으로 생각되네요.
그래서 recursively라고 했겠죠;;;
감사합니다.^^
덕분에 해결 봤습니다.
제 예전 기억이 잘못되어 있었나보네요^^
질문에 답변 주신분들 너무 감사합니다. 저도 답변을 달수있는 고수가 후다닥 되어야 겠네요^^
감사합니다.
감사합니다.
댓글 달기