배열 초기화(char arBuf[128] = {})에 대한 질문입니다.
글쓴이: 초코리 / 작성시간: 화, 2007/01/16 - 3:47오후
배열을 사용하다가 의문이 생겼습니다.
보통저는 배열을 선언하고 memset으로 초기화 하는 방법을 사용했습니다.
char arBuf[128]; memset(arBuf, 0x00, sizeof(arBuf));
그러다가 KLDP 검색중 cinsk님께서 쓰신 snprintf 관련 글중에
다음과 같은 배열 초기화 하는것을 봤습니다.
char buf[LEN] = { 0, };
예제로 테스트하여서 GDB로 찍어보기 0으로 초기화가 되었습니다.
그래서 혹시나하고
char buf[LEN] = {1, };
도해봤습니다.
(gdb) x/32b arBuf1 0xbfaf3ea4: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xbfaf3eac: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xbfaf3eb4: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xbfaf3ebc: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 (gdb) run
위와같이 초기화 되는것을 확인 할수 있었습니다.
처음만 1로 초기화 되고 나머지는 0으로 초기화 되는것을 확인했습니다.
그래서
char buf[LEN] = {};
위와 같은 코드를 넣고 확인해보니
(gdb) x/32b arBuf1 0xbfde99a4: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xbfde99ac: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xbfde99b4: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xbfde99bc: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 (gdb) quit
다음과 같은 코드로 초기화 한것과 동일하게 나오더군요..
memset(arBuf1, 0x00, sizeof(arBuf));
또 초기화에 대한 글을 찾아보고 있으니 다음과 같은 글타래에서
초기화에 대한 논의가 있었습니다.
http://kldp.org/node/31567
읽어보니 초기화 방법은 다양하고 최적화 했을때 성능차이는 미미하다라고
결론이 나는것 같습니다. (아니면 ㅡㅗㅡ:: 말씀해주세요 다시 읽어 보겠습니다.)
그래서 질문의 요지를 말하자면
초기화에는 각방법에 초기화에 문제가 없다면
다음과 같이 코딩하는데 제일 간편한 방법을 쓰고 싶습니다.
char arBuf[128] = {};
위코드가 arBuf를 0으로 초기화 하고
여러플래폼에서 사용가능한지 궁굼해서 질문올립니다..??
간단요약
배열을 0으로 초기화를 위해 쓴 다음 코드가 문제 없는 코드인가요??
char arBuf[128] = {};
Forums:
c를 안쓴지가 너무
c를 안쓴지가 너무 오래되어서 기억이 가물거립니다만, 0으로 값이 채워지는 것이 보장되는 곳은 heap(global variable) 영역이었던거같습니다.
stack(local variable)에서는 보장되지 않았던 것으로 기억합니다.
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂
TCPL 4.9 86페이지에
TCPL 4.9 86페이지에 보면 자동 배열도 배열 크기에 비해 initializer가 모자라면 나머지는 0으로 된다고 나와있습니다.
한글 2판 4.9 초기화
한글 2판 4.9 초기화 부분 119페이지에 나와있네요.
참고 하겠습니다.
답변 감사합니다.
배열을 0으로
C++ : 문제없습니다. 표준에 언급되어 있습니다.
C : 문제있습니다. 언급되어 있는지 모르겠지만, 허용되지 않는 거 같습니다.
gcc 에서 -ansi -pedantic 로 돌려보시면 warning 뜹니다.
표준문서를 좀
표준문서를 좀 찾아봐야 겠네요.. 답변 감사합니다.
댓글 달기