[C] 복잡한 구조체의 초기화
글쓴이: gurumong / 작성시간: 토, 2010/05/29 - 2:44오전
구조체가 맴버로 다른 구조체를 가지고 있어도 아래와 같은 초기화로
모든 맴버의 구조체들도 0의 값으로 초기화가 된다고 보장되나요?
struct t = {0, 0, 0, 0, {0, }, {0, {0, }}, 0};
struct t = {0, }; // 같은 코드?
다른 질문으로 memset으로 구조체의 메모리를 모두 0으로 초기화 하는것은
맴버로 포인터를 가지고 있다면 포인터를
(널포인터가 아닌) 의미없는 쓰레기값으로 초기화 하게 되는데
이때 어떤 문제가 발생할수있는지요?
책만 보면서 공부하다가 뭘좀 해보려니까
밑바닥 지식이 완전히 드러나네요 ㅜ.ㅜ
Forums:
struct를 지역(스택)
struct를 지역(스택) 변수로 선언 했을 때를 말씀하시는듯 합니다.
(어차피 광역변수는 초기화가 되는 곳이니까 패스~)
예제 코드가 말이 안되는듯 해서 제가 코드를 좀 수정해서 말씀 드리겠습니다.
다시 말해서 위에서처럼 선언하면 struct 모든 변수가 0으로 셋팅 되느냐는 질문이신듯 한데...
컴파일러가 하는 일이라 컴파일러마다 결과가 다를 수 있습니다.
하지만 새로운 표준에서는 초기화 되는게 맞습니다.
struct _t t = {}; 이렇게만 해도 모두 0으로 초기화 됩니다. 초기화가 보장 되는 것이지요.
그리고 포인터 변수 역시나 NULL값이 들어가겠죠.
보충 설명 하자면 c99을 따르는 컴파일러는 아래 예제에서 처럼 초기화 가능하고
특정 변수 지정을 안하면 모두 0 값이 들어 가도록 되어 있습니다.
결과는
> 구조체가 맴버로
> 구조체가 맴버로 다른 구조체를 가지고 있어도 아래와 같은 초기화로
> 모든 맴버의 구조체들도 0의 값으로 초기화가 된다고 보장되나요?
>
> struct t = {0, 0, 0, 0, {0, }, {0, {0, }}, 0};
> struct t = {0, }; // 같은 코드?
네, 초기치가 1개라도 있으면 나머지는 0 이 주어진 것과 같습니다.
(중괄호는 있으나 초기치가 없는 것은 문법 오류입니다)
> 다른 질문으로 memset으로 구조체의 메모리를 모두 0으로 초기화 하는것은
> 맴버로 포인터를 가지고 있다면 포인터를
> (널포인터가 아닌) 의미없는 쓰레기값으로 초기화 하게 되는데
> 이때 어떤 문제가 발생할수있는지요?
다수의 환경에서 all-bit-zero 는 널 포인터의 표현으로 쓰이지만,
말씀하신대로 그렇지 않은 환경이 있을 수 있습니다. 그런 환경에서는
다양한 일들이 발생할 수 있습니다 - 간단히는 초기화하지 않은 포인터를
사용하는 것과 다르지 않다고 생각하시면 됩니다.
memset(0) 으로 특정 변수를 바이트 단위로 초기화하는 경우,
- 정수형은 0 이 보장됩니다
- 부동형은 0.0 이 보장되진 않지만 현존하는 모든 시스템에서 0.0 입니다.
- 포인터는 널 포인터가 보장되지 않습니다.
(빼먹은 타입 없죠? ^^)
하지만, 알고 계시겠지만 0 은 정수 상수인 동시에 널 포인터 상수
(null pointer constant)이기 때문에 포인터로 대입되거나 포인터를
초기화하는 경우 정상적인 널 포인터로 만든다는 것이 보장됩니다.
따라서 memset() 이 아닌 위와 같은 초기화에서는 포인터 멤버는
널 포인터로 초기화된다는 것이 보장됩니다.
> 책만 보면서 공부하다가 뭘좀 해보려니까
> 밑바닥 지식이 완전히 드러나네요 ㅜ.ㅜ
겸손의 말씀을... ^^
날 더운데 화이팅입니다!
--
Jun, Woong (woong.jun at gmail.com)
Web: http://www.woong.org (서버 공사중)
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
댓글 달기