CnUnix

[알림판목록 I] [알림판목록 II] [글목록][이 전][다 음]
[ CnUnix ] in KIDS
글 쓴 이(By): Lucifer (Satan)
날 짜 (Date): 1995년08월29일(화) 02시13분47초 KDT
제 목(Title): 간단한 문제의 답!!


이답은 다음과 같습니다.. (이건 우리 선배가 보낸 메일의 일부임)


에,,, 여러가지 가능성이 있는데
(1) 옛날옛날 cc에서는 void func(prototype)을 이해하지 못하여 
    컴파일이 되지 않는다.
(2) 0 이라고 나오거나 이상한 숫자가 나온다.
    (buf[2..5]의 내용이 long으로 casting 된 내용,
     아마도 대개 0으로 되어있을것임 (경험상))
(3) (2)의 답은 특수한 컴퓨터나 컴파일러상에 해당되며
    현재 흔히 쓰는 Workstation에서는 4Byte 단위로 
    자료 접근이 이루어지게 된다(alignment)
    따라서, 위의 lvar = ... 문장에서는

       alignment 때문에 이 경계를 걸쳐 addressing 을 할 수 없다.
                    |
    buf             V
    +---+---+---+---+---+---+---+---+---+
    | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |...
    +---+---+---+---+---+---+---+---+---+
            ^               ^
            |               |
            +- lvar casting-+

     이런 현상이 발생하고, 이때 사용자는 "bus error"라는 친숙한
     에러 메세지를 경험하게 된다.

    (2)의 답이 나오는 경우느 4byte로 alignment가 이루어지지 않을 경우.

--
아마.. 실제 수행을 해보면 대부분의 경우 (3)번과 같이 "bus error"라는

메시지가 나오면서 죽을 겁니다..

그러니까.. 김경철님의 답이 정답이라고 할수가 있겠죠..

컴파일 할때..  -misalign 이라는 옵션을 사용하면 문제없이 수행이 됩니다..
(직접 해봤음..)

아~~ cc 에는 이런 옵션이 있지만.. gcc에는 없는듯 합니다..
(자세히 찾아보지는 않았음..)

참 재밌는 문제죠??


그럼 이만..

--

밤이다.
하늘은 푸르다 못해 농회색으로 캄캄하나 별들만은 또렷또렷 빛난다. 침침한 어둠뿐
만 아니라 오삭오삭 춥다. 이 육중한 기류속에 자조하는 한 젊은이가 있다. 그를
나라고 불러두자....  - 별똥 떨어진데.. -

[알림판목록 I] [알림판목록 II] [글 목록][이 전][다 음]
키 즈 는 열 린 사 람 들 의 모 임 입 니 다.