메모리 공간의 할당과 초기화가 동시에 일어나는 상황
김애교
C++ 책을 봤는데... 책에서
int SimpleFunc(int n)- 여기{ ... return n;- 여기}
int main(void){ int num = 10;- 여기 printf(%d\n, SimpleFunc(int num)); ...}
이렇게 3군데에서 메모리 공간이 할당되면서 초기화가 된다고 나와있는데...
다른 부분은 다 이해 되는데 return 부분이 이해가 안되는데
return 하는 순간에도 메모리가 할당이되고 이 때문에 main 문에서 출력이 된다고 나와있는데...
인자를 int가 아니라 char *로 받고 문자열을 받아서 그 문자열 길이를 리턴한다고 해도 문자열 길이가 출력이 되니까
책에 나온데로 어딘가에 메로리가 할당이 되긴 될 것 같은데...
그럼
#include stdio.h#include string.h
char *temp();
int main(){ char *b = NULL;
b = temp(); printf(%s, b);
return 0;}
char *temp(){ char a[] = test\0;
return a;}
이와 같은 코드에서도 test가 출력이 되야 되는거 아닌가요?
함수 내에서char a[] = test; 가 선언됐지만 char *형을 반환하고 이 역시 어딘가에 메모리가 할당 되었을거고
이를 main 함수 에서 char *형에 저장해서 출력을 하니... 출력이 되야 되는거 아닌가요?return 할 때 메모리는 어느 영역에 할당이 되는 건가요? 리터럴 상수와 같은 영역에 할당이 되는건가요?
그리고 메모리 해제 시점은 어떻게 되는지...
return 할때 메모리가 할당이 되고 그로인해 main 함수 내에서 출력문으로 출력이 되는거라면 위와 같은 경우나
#include stdio.h#include string.h
char *temp();
int main(){ printf(%s, temp());
return 0;}
char *temp(){ char a[] = test\0;
return a;}
이와 같은 경우 test가 정상적으로 나와야되지 않나요?
char *형을 반환하고 있고 이는 어딘가에 메모리 할당이 되었고 이를 인자로 넘겨주고 출력하는건데...#include stdio.h#include string.h
char *temp();
int main(){ printf(%s, temp());
return 0;}
char *temp(){ char a[20] = test\0;
return a;}
이렇게 하면 test가 나오고 뒤에 쓰레기값이 더 출력이 되네요 대부분...
이는 temp 함수 내부에서 지역변수가 선언됐고 반환은 이 지역변수의 시작 주소값이고
temp 함수가 반환하면서char a[20] = test\0; 할당된 메모리가 해제되어서 다른 곳에서 메모리를 또 사용하기 때문에
그런거라면... 어째서 test는 계속 정상적으로 나오고 맨 뒤에 붙은 \0(널문자) 부분만 지워지는지...
그리고
#include stdio.h#include string.h
int temp();
int main(){ printf(%d, temp());
return 0;}
int temp(){ int a = 3;
return a;}
이렇게 하면 이건 정상적으로 나오는데... 이건 또 왜 그런지;;
이해가 되질 않는데... 아시는 분 설명좀 부탁드리겠습니다. ㅠ.ㅠ
컴파일러는 VS2012 이고 다른 컴파일러에서는 다른 결과가 나올수도 있을것 같네요...
-
BlackCat
아 그렇네요
4바이트만큼만 정상적으로 나오네요
답변 감사드립니다. -
요루
test가 정상적으로 나온건 우연이고요
char[5]만큼의 메모리가 할당되는게 아니라
char*만큼의 메모리가 할당됩니다. (4바이트)
어쩌면 이것때문데 test가 나왔을수도 있겠군요.
하여튼 test가 나온 이유는 컴파일러가 vc2012라서...
컴파일러에 따라 다릅니다.
번호 | 제 목 | 글쓴이 | 날짜 |
---|---|---|---|
2692451 | 이 문제좀 풀어주세요 ^^ | 게자리 | 2025-04-23 |
2692424 | 2차원배열 자료입력질문이요! (1) | 똘끼 | 2025-04-22 |
2692401 | 유닉스안에서 C언어를 이용한 명함 만들기 입니다; 이해안가는 부분이있네요 | 2gether | 2025-04-22 |
2692374 | 고수님들 댓글 마니부탁해요!!! (2) | 엄지 | 2025-04-22 |
2692343 | scnaf에 자꾸 선언을 참조하라는데;; (8) | 도래 | 2025-04-22 |
2692282 | 도스상에서 생성된 exe파일에 press~ 뜨게 하기 (4) | 회사원 | 2025-04-21 |
2692256 | scanf("%*c"); ㅠㅠ 고수님들 | 거북이 | 2025-04-21 |
2692230 | 하노이탑 질문입니다. (1) | 미쁘다 | 2025-04-21 |
2692210 | 정보 올림피아드 문제인데.. 풀이 과정이 궁금합니다.(재귀함수) (5) | 물티슈 | 2025-04-20 |
2692144 | C언어와 리눅스에 대한 질문입니다. | 싴흐한세여니 | 2025-04-20 |
2692114 | 컨텍스트 스위칭하는데 걸리는 시간 측정.. | YourWay | 2025-04-19 |
2692086 | 간접참조 연산자, 증감연산자 질문이용! (2) | 블랙캣 | 2025-04-19 |
2692056 | 주석좀 달아주세요. 몇개적엇는데 몇개만달아주세요. (2) | DevilsTears | 2025-04-19 |
2691978 | 진수 쉽게 이해하는법... (3) | 지지않는 | 2025-04-18 |
2691949 | getchar() 한 문자를 입력받는 함수 질문 | 채꽃 | 2025-04-18 |
2691919 | 배열 정렬 및 합치기 질문입니다. | 사과 | 2025-04-18 |
2691845 | c언어왕초보 질문이 있습니다........ | 루나 | 2025-04-17 |
2691815 | void add(int num); 함수... (4) | 살랑살랑 | 2025-04-17 |
2691756 | 명령 프롬프트 스크롤바가 없어요 | 두메꽃 | 2025-04-16 |
2691725 | 자료구조에 관련해서 질문이 있어 글을 올립니다. | 누리알찬 | 2025-04-16 |