|  |
| |
| /x7375696e6567 |
질문이 정확하게 이해가 안되긴하는데
충돌이 나게끔 프로그래밍 한다는게,
헛점을 보이게끔 프로그래밍 한다는소린가요???
그렇다면 뭐 힙메모리를 설정한뒤에 해제를 안해주면 꽤 큰 헛점이될듯싶은데요 |
2011/03/21 |
|
asdwho |
생각해봤는데 충돌 할 수 있을 것 같네요. 힙에다가 메모리 설정한다음 스택으로 계속 쌓다보면 오류가 발생하는 경우요. 자세한 답변을 기다려보겠습니다. |
2011/03/21 |
|
| Prox |
일단 알아두셔야 할 점은, 스택공간은 크기에 제한이 있구요
그 정해진 공간을 넘어서게 되면 세그멘테이션오류가 납니다.
저도 정확하게 알아보려고 간단한 코딩을 해봤는데요 (리눅스기준)
재귀함수를 튕길때까지 계속 호출해보는겁니다
(함수에 필요한 정보들은 스택에 저장됨. 재귀호출을 열번하면 함수의 스택프레임이 10개가 쌓임.
이렇게 무한히 쌓다보면 언젠가 한계에 부딪치게 되겠지요)
#include ((stdio.h))
void infloop() {
int i; //지역변수이므로 스택에 변수가 할당됩니다
printf("%x\n",&i); //할당된 주소를 16진수 출력(즉 현재 스택포인터를 출력하는 것과 비슷함)
infloop(); //재귀호출
}
void main(){
int start;
printf("start %x\n",&start); //main함수일때 스택의 위치를 출력
infloop();
}
이런식으로 코드를 짜니깐..
시작주소 bffff540
팅길때주소 bf8006b4
시작주소 bfffe8f0
팅길때주소 bf7ff6a4
이렇게되는 걸로 보아 스택에 할당되는 크기는 bfffxxxx 부터 아래로 0x800000 정도이구요..
(힙영역은 800만대 주소부터 생성되더군요)
스택이 아무리 자라봐야 전체 메모리에 비해서는 턱없이 작은 공간이기 때문에..
가상메모리공간은 0000 0000~FFFF FFFF 로 아주크게 주어지는데
"스택이 위로 자라나기 때문에 힙영역과 충돌이 생긴다"는건 생각하기 힘들거 같네요. |
2011/03/22 |
|
| Prox |
또 가상메모리공간에는, 힙+text섹션(main함수등)+스택 말고도
라이브러리 함수나 기타 여러가지 데이터들도 많이 올라와 있는데
힙이 무한히 크게 할당된다고 가정하면, 저 멀리있는 스택에 부딪치기 전에
다른것들에 부딪쳐 오류가 나지않을까 하네요 |
2011/03/22 |
|
asdwho |
ㄴ 답변감사합니다. 스택은 크기에 제한이 있는거군요.
정확히 메모리 세그먼트에는 텍스트, 데이터, bss, 힙, 스택이 있다고 알고 있습니다.
근데 힙 바로 밑에 스택이 있는 구조더군요 ㅎㅎ 나중에 힙을 늘려서 어디에서 세그멘테이션 폴트가 나는지 실험해봐야겠습니다 ㅎㅎ |
2011/03/22 |
|