인프런 커뮤니티 질문&답변

밑바닥개발자님의 프로필 이미지
밑바닥개발자

작성한 질문수

독하게 시작하는 C 프로그래밍

함수 이름의 메모리 주소

해결된 질문

작성

·

123

·

수정됨

0

안녕하세요~ 강의 열심히 따라가다가 그동안 배워온 것들 복습을 진행중입니다. 그러다가 함수 관련해서 질문이 있는데요!

 

강의 속에서 함수를 정의하면 해당 함수의 이름에는 배열처럼 메모리 주소가 할당된다고 하셨는데요! 좀 더 자세히 살펴볼려고 디버그 모드로 정의된 함수 이름에 어떤 메모리 주소가 들어가 있는지 살펴보고 있었습니다.

 

Q1. 그런데 특이하게 디버그 모드를 최초로 실행할 때부터 함수 이름에 메모리 주소가 일종의 쓰레기값..(사진 속에서는 16진수로 ff 값이 적혀있네요)으로 정의되어 있고 이후 코드 실행 step 을 계속 실행시켜도 별다른 값으로 업데이트가 되지 않더라구요. 그렇다는 것은 런타임에 들어가기 전부터 빌드 타임에 함수 이름에는 메모리 주소가 최초로 1번만 할당되고 런타임 때는 할당되지 않는 것으로 이해하면 될까요?(마치 size of 연산자처럼 컴파일 연산자 처럼요..비교가 좀 다를 수 있긴 합니다만..)

스크린샷 2024-08-04 오후 5.46.54.pngQ2. 함수의 메모리 주소도 포인터를 이용해서 막 여기 저기 활용하는 사례도 많나요??(마치 문자열이나 다른 배열을 포인터로 활용하는 것처럼..)

 

Q3. 그리고 어쨌건 최초로 변수를 선언하고 정의할 때 메모리가 할당되는 시점은 무조건 빌드 타임에 할당되는 것이죠? 그러면 런타임에 메모리가 할당되는 시점도 있나요..? 자꾸 헷갈리네요!

 

혹시 질문이 이해가 안가신다면 답글 달아주세요! 감사합니다 :)

답변 3

1

밑에서 인턴이 답변해주어서 제가 질문드린 부분은 어느정도 해결이되었습니다! 아래 질문에 대해서만 강사님이 답변 가능하신지 여쭙습니다!

 

  1. 그러면 함수의 메모리 주소에 대해서도 런타임에서 수행하는 '동적 메모리 할당'도 이루어지는 경우가 흔할까요? 문자열이나 배열에 대해서는 동적 메모리 할당을 받아서 하는 경우는 강의에서도 예시를 들어주시면서 해주셨는데, 함수의 이름 즉, 함수의 메모리 주소에 대해서도 동적 메모리 할당을 받게되는 경우도 있나요?

 

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

함수는 실행코드로 번역됩니다. 이를 동적 할당하는 경우는 흔치 않습니다. 함수 코드는 컴파일러에 의해 결정되어 정적으로 존재하는 메모리에 저장됩니다. 그러나 JVM 같은 프로그램은 Java byte code를 실행 중 Native code로 번역합니다. 이 과정에서 실행 코드가 저장될 메모리를 동적할당해 저장할 가능성은 있습니다.

JVM이나 그에 준하는 미들웨어를 개발하는 경우가 아니라면 실행 코드가 저장될 메모리를 동적할당 하는 일은 잘 없을 것으로 보입니다. 적어도 제 경험상 그렇다고 답변드릴 수 있겠습니다. 참고하시기 바랍니다. 😃

답변 감사합니다~ 아하 문자열 상수에서 문자열 상수 '값' 자체는 실행 코드에 저장되지만 메모리는 정적 영역 메모리에 저장되는 것처럼 함수도 똑같나 보군요! 몰랐습니다!

0

널널한 개발자님의 프로필 이미지
널널한 개발자
지식공유자

관리용 댓글입니다. :)

0

안녕하세요, 인프런 AI 인턴입니다.

Q1. 네, 맞습니다. 함수 이름에 해당하는 메모리 주소는 런타임이 아닌 컴파일 타임에 결정됩니다. 컴파일러가 코드를 머신 코드로 변환하는 과정에서 함수의 시작 위치를 가리키는 메모리 주소가 결정되며, 이 주소는 프로그램이 실행되는 동안 변경되지 않습니다. 따라서, 함수의 메모리 주소는 최초 한 번 할당되고 런타임에는 변경되지 않는 것으로 이해하시면 됩니다.

Q2. 네, 함수의 메모리 주소를 포인터로 활용하는 사례는 실제로 많습니다. 예를 들어, C 언어에서 함수 포인터를 사용하여 콜백 함수를 구현하거나, 다양한 함수를 동적으로 선택하여 호출하는 등의 작업에 활용됩니다. 이를 통해 프로그램의 유연성을 높이고, 다형성과 같은 개념을 구현할 수 있습니다.

Q3. 변수의 메모리 할당 시점은 변수의 타입과 선언 위치에 따라 달라집니다. 정적 메모리 할당(static memory allocation)은 컴파일 타임에 수행되며, 대표적으로 전역 변수나 static 변수가 여기에 해당합니다. 반면, 동적 메모리 할당(dynamic memory allocation)은 런타임에 수행되며, 프로그램 실행 중에 메모리 크기가 결정되고 할당됩니다. C언어에서는 malloc 함수를 통해 동적 메모리 할당을 수행할 수 있습니다. 따라서, 빌드 타임에 할당되는 경우와 런타임에 할당되는 경우 모두 존재합니다.

질문에 대한 답변이 되었길 바랍니다. 추가로 궁금한 점이 있으시다면 언제든 질문 남겨주세요!

밑바닥개발자님의 프로필 이미지
밑바닥개발자

작성한 질문수

질문하기