컴공과 대학생 질문드립니다) C99 컴파일 관련
글쓴이: 0Hooo@Naver / 작성시간: 금, 2024/09/06 - 6:25오후
안녕하세요! 저는 고려대학교 편입을 준비하고 있는 학생입니다.
다름이 아니라 C99의 배열에 대해 공부하고 있던 와중 궁금한 점이 생겨 질문 드립니다.
1. 초기값 리스트의 크기가 배열의 크기보다 큰 경우 에러가 발생한다.
2. 가변길이배열(VLA)라도 sizeof연산은 컴파일 시점에 수행된다.
이 두 선지중 1번이 틀리고 2번이 맞다고 하는데요,
강의하시는 분 설명은 이렇습니다.
C99 의 IDE에서는 초기값 리스트의 크기가 배열의 크기보다 큰 경우에도 에러를 내어주지 않는다고 하고,
Visual Studio에서 에러가 나는 이유는 컴파일러 자체가 걸러주기 때문이라고 설명하십니다.
2번째 선지가 맞는 이유는 그냥 특이사항으로 외우라고 하시는데, 외국 글이나 다른 인터넷에 찾아보아도
sizeof 연산은 runtime에 수행된다고 나와있는 것 같습니다..
정확한 정보인지 모르겠어서 질문드립니다.
참고로 강의를 찍으시는 분은 현직 개발자십니다..
Forums:
음 ..
1 - 대개는 compiler 가 실행 옵션에 따라 warning 이나 error 를 띄워주는데, 운이 좋다면(?) run time 에 문제가 드러나겠죠. 표준에 array 에 initializer 를 assign 하는 경우, 크기에 대한 언급이 있었는지는 잘 모르겠네요.
2 - sizeof 는 compile time 에 integer constant 로 변환되는데, VLA 의 경우에는 run time 에 평가됩니다. 내용이 뭔가 반대로 된 것 같네요.
https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
6.5.3.4 The sizeof operator
- 2, 7 항목 참조
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
해보면 되겠쥬?
해보면 되겠쥬?
컴파일 하면
gcc는 에러는 아니고 워닝이네요.
코드를 요래 수정 하면
결과는
컴파일러가 알아서 배열 크기만큼만 짤라서 초기화하니깐 워닝으로도 충분한가봅니다.
요건 가변 배열에 대한 sizeof 함수고요
요건 고정 배열에 대한 sizeof 함수입니다.
컴파일해서 역어셈블 해 보면
졸라 길죠? 누가 봐도 run time에 뭘 하고 있는 코드입니다.
그러면 고정 배열일 때는?
짧쥬? 중간에 0x17을 eax에 넣는 코드가 보입니다. 0x17은 23이니깐 컴파일 타임에 int로 변환하는거 맞네요.
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
IDE가 아니라 표준을 봐야지요..
IDE가 아니라 표준을 봐야지요..
특히 C/C++과 같은 언어는 컴파일러 한두개의 behavior가 아니라 정확한 표준을 참고해야 합니다.
C99 표준 §6.7.8.2
"No initializer shall attempt to provide a value for an object not contained within the entity being initialized."
§6.5.3.4
"2. If the type of the operand is a variable length array type, the operand is evaluated; otherwise, the operand is not evaluated and the result is an integer constant."
댓글 달기