char buffer1[100];
char buffer2[100]; 선언하면
buffer1이 buffer2보다 주소가 높잖아 (스택은 높은주소에서 낮은주소로 자라니까)
문제는 내가 뭘 디버깅하는데
buffer1[2000];
buffer2[500];
이런식으로 되어있었어 buffer2가 buffer1보다 주소가 높더라 원래라면 buffer1이 먼저 선언되니까 주소가 높아야하는데말이지
이것떄문에 지금 엄청난 혼란이오고있어 내가 지금까지 알고있던건 먼저 선언된게 높은주소인데...
뭐때문임?
컴팔러 맘대로예유. 사용되는 순서에 따라 바뀜. 그게 싫으면 구조체로 싸거나 전역 고고싱.
ㄴ진짜 컴파일러 마음임? 스택인데???
스택의 증가방향을 주소 감소 방향으로 가정하는건 조금 위험함유. 어떤 컴파일러는 디버깅모드에서 증가, 릴리즈에서 감소로 동작하는 경우도 있음.
ㄴ "쌓인다" 라는 개념이 중요한거아니었음
헐 대박
오늘 첨알았는데 ............
ㅇㅇ static 은 정해진 위치에서 추가될때 주소가 밀려나지만 지역변수는 undefine 일거임.
어차피 비표준이니 그런 방법은 가정하지 않고 작성하는게 좋음. 사용자 스택으로 명시하든지 하세유.
그렇게 된 이유는 static 은 정의된 순서에 따라 실행파일이 실행될때 0으로 초기화할 의무를 갖고 있는거임유. 특별히 초기값을 줬을땐 그것으로.
그런데 stack 은 초기화 책임이 개발자에게 있기 때문에, 함수 내에서 초기화되고 접근하게 되고, 컴파일러가 효율을 따질수 있도록 융통성을 허용한거죠.
그러니까 아마 초기화 코드를 정의에 포함시키면 순서가 어느정도 잡히긴 하겠쥬. 그런데 그 방법도 어차피 딱히 defined 는 아닐것 같아서 비추천.
딱히 0으로 초기화해야하는 의무를 가진다는게 효율을 떨어뜨릴수도 있고 말이죠.
.... 으아........... 혼란이다......
뭐가 혼란임유 그냥 그런건 구조체 싸서 접근 고고싱.
ㄴ 오버플로우 공부하고있었거든요 ... 근데 지금껏 봐온 수많은 예제들은 다 제가 아는 순서대로 되어있어서 혼란이왔었네용 감사합니다