|
:: 게시판
:: 이전 게시판
|
이전 질문 게시판은 새 글 쓰기를 막았습니다. [질문 게시판]을 이용바랍니다.
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
09/04/12 23:43
워낙 다양한 경우가 있어 소스를 보지 않고는 모르겠지만 일단 스택이 넘쳤다는걸로 보아...
혹시 프로그램 데이타에 엄청난 양의 데이타를 넣으셨나요? 예를 들어 int array[3434343434]; 이런식으로 큰 데이타가 혹시 있나 한 번 보세요.
09/04/12 23:45
MoreThanAir님// 전혀 아닙니다. 저도 그럴것 같아서 계산해봤는데
배열 여러개랑 변수 다 더 해도 2MB도 안됩니다.... 헉..;; 도저히 오버플로우가 발생될것 같지 않은데요...
09/04/12 23:49
#define N 512
void main() unsigned char a[N][N]; unsigned char b[N][N]; unsigned char c[N][N]; unsigned char d[N][N]; float e[256] = {0, int f[256] = 0, ;
int i, j, g, h; FILE *fp; } 변수 선언부만 붙였습니다. 나머진 좀 길어서요...;;
09/04/12 23:51
float 배열 선언하면서 stack overflow되었을 가능성이 커 보입니다.
main함수 밖에서 선언해보세요.(그래도 안되면... 다음분이 ;;) MoreThanAir님// main()에서 바로 overflow한다는 걸 허투루 읽었습니다. 제 착오입니다 하하..
09/04/12 23:56
정적 배열은 결국 스택오버플로우를 일으킬 가능성이 높습니다.. 그것도 상당히요.
간단하게 이미지처리할때 2차배열로 여러개 잡다가 아무것도 못해보고 스택오버플로우를 맛볼 수 있죠.. 2중포인터를 써서 동적 할당을 해보시는게 어떠실런지... 넓디 넓은 힙 영역을 애용합니다!!
09/04/12 23:56
지금 데이타가 모두 정적으로 선언되었기 때문에 일단 DS(데이타 세그먼트)에 프로그램이 실행되기 전에 할당이 됩니다.
1바이트짜리가 일단 512*512bytes 거기다가 변수가 4개니까 4배가 되겠네요. float가 256개 integer가 256개 integer 변수 4개 파일 포인터 변수 한개 float 위의 선언만으로 1048576바이트가 필요합니다. 이것이 DS의 범위를 넘어간 것 같습니다. 변수를 포인터로 선언 후에 필요할 때 동적할당 해서 사용해야 될 듯 합니다.
09/04/12 23:57
추가로 N의 값을 10으로 해서 시험해보시면 제대로 될껍니다. 그래서 제가 처음에 배열 인덱스가 큰 값이 아니었는지 물었던거구요.
참고로 정적으로 변수들이 선언되면 값을 넣지 않아도 메모리 상의 일정 부분을 미리 allocate하는겁니다.
09/04/12 23:57
원래 좀 그러지 않나요? 잡아 먹는 용량이 몇 기가 이런 게 아니더라도 상대적으로 큰 어레이 만들 경우는 동적 할당을 하는 편이 낫던데요.
int a[200][5000] 뭐 이런식으로 잡으면 런타임 에러내며 다운 나는 경우 종종 있더라구요. 동적 할당이 문제 생기는 경우가 아니라면 귀찮더라도 그렇게 해보시는 게 어떨까요? 저게 에러나는 크기가 os 나 메모리 양에 따라서 가변적이라 동적이 안전한 것 같더라구요. 이상 C 허접의 답변이었습니다. 크
09/04/13 00:08
아.. 그렇군요.. 해결됐습니다.
unsigned char[N][N]을 4개에서 1개로 줄이니까 되네요... 저는 스택공간이 꽤나 크다고 생각했는데 꼭 그런것도 아닌가보네요... 후훗 어쨌든 하나 더 배웠네요.. 답변 주신 분들 모두 진심으로 감사드립니다. 아 그리고 stack공간이 보통 얼마정도 되는지 아시는분 계신가요?
09/04/13 00:12
시스템마다 다릅니다. 보통은 전체 메모리 크기에도 영향을 받습니다
http://www.computerworld.com/computerworld/records/images/story/image004.jpg 이 그림을 참고하세요
09/04/13 10:35
스택을 아주 크게 잡으면 컴파일도 안됩니다
이 크기를 실험해 봤었는데 컴파일러마다 다르게 나오고... 왔다갔다 하더군요 중간 크기면 경험하신 것 처럼 실행 단계에서 에러가 나옵니다 스택에 대해 공부하시려면 해킹 쪽에 오버플로우 강좌를 찾아보세요 버퍼 오버플로우가 가장 쉬운데 이것에 대해 공부하면 스택의 사용에 대해 확실히 알 수 있습니다
|
||||||||||