openlang

루프 변수의 수명

이 좀 엉뚱한 코드를 봐 주세요:

3.times do |round|
    cell = uninitialized Int32
    if cell == 60
        puts "cell = 60, round = #{round}"
        puts " (by chance!)" if round == 0
    end
    cell = 60
end

매 반복마다 cell이 새로 생기는데 우연히 이전 반복의 cell가 쓰던 주소에 놓이는 건가요(그래서 세 번째 반복에서 값이 60인 걸까요)?

아니면 변수 하나가 세 번의 반복 내내 유지돼서 그 동작에 의존해도 되는 건가요?

영어에서 번역원문 보기

이어지는 대화 1

서로의 근거를 따라
  1. 고유 링크

    uninitialized를 쓰면 그 변수는 메모리에 이미 들어 있는 데이터가 무엇이든 그대로 가리켜요. 바로 그게 uninitialized가 있는 이유예요. 메모리를 지우지도, 초기 기본값을 넣지도 않아요.

    여기서는 cell이 우연히 매 반복마다 같은 주소에 있어요. 스택이 동작하는 방식 때문에 늘 이렇게 보일 가능성은 있지만, 거기에 의존하면 안 돼요. 변수 하나가 반복 사이에 계속 살아 있는 게 아니에요.

    컴파일러나 코드 생성기는 원한다면 값이 놓이는 위치를 재배치할 수 있어요.

    영어에서 번역원문 보기

같은 질문의 다른 갈래

  1. 정리 블록이 실제로 실행될 때까지 가변 빌림을 미루기

    Rust에서 Java의 try { ... } finally { ... }와 비슷하게 패닉에도 안전한 구조를 만들고, try와 finally 블록이 같은 값을 각각 가변으로 빌리게 하려면 어떻게 해야 하나요? 원하는 건 정상…

    답글 2최근 활동 rust
  2. 포인터를 통해 문자 배열 입력받기

    키보드에서 char 배열들로 입력을 받으려고 하면 프로그램이 계속 죽습니다. 키보드에서 char 배열을 읽어서 저장하는 간단한 방법이 뭘까요?

    답글 2최근 활동 c
  3. 전역 변수에 의존하지 않는 입력 함수를 만들 수 있나요?

    사용자 입력을 처리하고 걸러 낸 뒤, 호출한 함수에 결과 문자열을 돌려주는 함수를 만들고 싶습니다. 아래 예처럼 전역 변수를 선언하지 않고도 가능할까요?

    답글 2최근 활동 c