int* makeA()
{
int a[3] = { 1, 2, 3 };
return a;
}
int main()
{
int* a = makeA();
cout << *a << '\n';
cout << *a << '\n';
}
makeA 안에서 정적 할당한거를 포인터로 넘겼는데
일관되게 쓰레기값이 나오면 모르겠는데...왜 두 출력이 다른지 모르겠어요
첫째 줄에서는 1이 나오는데 둘째 줄에서는 쓰레기값이 나오네요
대체 원인이 뭔가요??
int* makeA()
{
int a[3] = { 1, 2, 3 };
return a;
}
int main()
{
int* a = makeA();
cout << *a << '\n';
cout << *a << '\n';
}
makeA 안에서 정적 할당한거를 포인터로 넘겼는데
일관되게 쓰레기값이 나오면 모르겠는데...왜 두 출력이 다른지 모르겠어요
첫째 줄에서는 1이 나오는데 둘째 줄에서는 쓰레기값이 나오네요
대체 원인이 뭔가요??
저런 코드는 무슨일이 일어나도 안 이상함
함수 내 지역변수는 함수가 종료되면 사라짐
사라지는건 아는데 왜 두 출력이 다른지를 물어보는 거였어요...
그럼 무슨 값이 나와도 이상하지 않은 게 정상입니다
도대체 이런 코드는 왜 있는지는 모르겠는데, 개인적으로 포인터 공부는, 자료구조 쪽 공부하면서 같이 배우는게 훨씬 이해하기 쉬움
포인터를 안쓰면 개좆같은 상황에서 포인터를 공부하고 써보고 배워야 훨씬 쉬움
그냥 어떻게될지 궁금해서 시험삼아 작성한 코든데...아무것도 안했는데 중간에 값이 바뀌길래 신기해서 물어보러 온거였어요
암튼 공부 열심히할게요 ㄳㄳ
cout도 결국 함수호출을 통해 일어나기 때문에 그전에는 1로 덮혀있던 메모리영역이 cout 함수 호출 과정에서 쓰레기값으로 덮히게 되어서 그럼. 함수호출규약 / 시스템프로그래밍 지식 없으면 이해할 수 없고 관련 지식 있으면 직접 gdb나 기타 디버거 붙여서 값 추적해봐
글쿤요...좋은 답변 감사합니다 지금은 그냥 그러려니 해야겠네요ㅋㅋㅋ
이런 코드에 메모리, gdb 설명은 딱히 맞지 않는것같고 함수 안에 있는 로컬 변수의 생명이 끝난 뒤에 그 변수의 주소를 사용하는 거라서 undefined behavior임. 무슨 일이 일어나도 상관없기 때문에 이런 코드를 논하는것 자체가 의미없음
질문자도 해당 코드가 undefined behavior인건 알고있는데 왜 첫번째 출력에서는 1이 잘 나오고 하필 두번째 출력부터 맛탱이가 가는지를 궁금해하니 UB니까 신경쓰지마세요보다 더 로우레벨에서의 답을 준거지
그니까 이미 ub가 발생한 상황에서 로우레벨 자체가 의미없다고.
ub라도 실행은 되는 상황에서 동작 원리가 궁금할수도 있는데 왜 의미가 있다 없다를 멋대로 정하는거임?
왜냐하면 너가 한 설명이 부정확하거든. UB코드에서 동작 원리가 대체 무슨 의미가 있음
ㅋㅋ
다른 사람인데 뭐가 부정확한지 말해보셈.
정확한 설명은 "잘못된 코드를 썼기 때문에 니 머신이 멋대로 결과를 출력한다"임
언어가 사양을 정해놓지 않았음(UB) 어떤 머신이냐 어떻게 컴파일했느냐에 따라서 결과가 바뀔수 있음 지금같은 경우는 스택이 사라진 위치에 cout하면서 이전에 남아있던 값을 출력했다가 cout하면서 쌓인 스택때문에 쓰레기 값이 된걸수도 아니면 기적같이 쓰레기값이 동일한값이 된걸수도 있고.. 하다못해 release빌드/debug빌드 하나로도 ub 실행결과는
바뀔수 있음. 원리는 직접 메모리 뜯어보면 얼추나오겠지만 언어와는 이제 관계없는 지식이 될거
Ub상황에서는 작동 방식의 의미가 없음. 그 머신 그 상황에만 그렇게 돌았을 뿐이지 다시 실행했더니 결과가 다르더라 다시 실행했더니 윈도우가 날라가더라 맥에서 돌리니까 프로그램이 꺼지더라 모두 일어날수 있음
환경에 따라 다르다면 확실히 제 질문이 의미없는 질문일 수도 있겠네요...많은 분들 덕분에 배우고갑니다 감사합니다
제가 추측할때는 << 연산자를 호출하면서 스택이 바뀌어서 그런 것 같네요. 처음 *a 고 접근할땐 그냥 그대로 평가되지만, 두 번째 접근할 때는 << 연산자가 호출된 후라 스택이 다른 값으로 덮어씌워진듯