<C언어> 배열과 포인터를 이용하여 여러개의 함수안에 작성하던 중.
글쓴이: interweb8 / 작성시간: 목, 2010/05/06 - 9:27오전
배열과 포인터를 이용하여 여러개의 함수안에 작성하던 중.
컴파일시 에러는 발생하지 않지만 메모리를 잘못 참조했는지 자꾸 exe실행오류가 뜹니다.
일일이 찍어봤더니 어느 한 부분이 잡히는데요.. ㅠ.ㅜ
아래처럼 작성했더만 에러는 나지 않지만 계속 exe실행 오류가 납니다.
int main()
{
char a[1000]={0,};
pre(a);
}
void pre_req(*a)
{
char b[2000]={0,};
while(1)
{
배열 a에 대한 여러가지 연산 종료후
break;
}
pre_rsp(b);
}
void pre_rsp(*b)
{
char c[2000]={0,}; <----이부분 추가하면 실행오류가 발생합니다.
while(1)
{
배열 b에 대한 여러가지 연산 종료후
break;
}
}
Tip좀 알려주세요 ㅠ.ㅜ
전체 풀 소스는 사정상 올려드릴수가 없답니다.
혹 실행 오류 발생시 대처법이나 서적 추천해 주신다면 바로 달려가 보도록 하겠습니다.
감사합니다.
초보이하 프로그래머...
Forums:
혹시 함수 내에서
혹시 함수 내에서 선언한 배열을 함수 외부에서 참조하지는 않나요?
배열의 선언부의 크기문제였습니다.
노가다 printf 이용해서 찾아냈어요 -0- 기쁘네요...
휴...
초보이하 프로그래머에게 권하는 학습법좀 추천해주세요 하핫 -0-
{0,} 으로 초기화하는 방법은
실행 파일 사이즈를 증가시킵니다. 더구나 이것을 함수 내에서 수행한다는 것은 흔한 방법은 아닙니다.
추천할만한 좋은 방법은 memset 을 이용하는 것입니다.
감사합니다. ^^
감사합니다. ^^
답글 보고 한번 테스트를 해보았습니다.
결과는 컴파일러 마다 다르더군요.
cygwin에서 gcc로 어셈코드를 뽑아보았을 때는
char a[1000] = {0,};
이렇게 하는게 조금 더 코드 사이즈가 크게 나왔지만
ADS 1.2를 이용하여 어셈코드를 뽑았을 때는
완전히 동일한 어셈 코드가 나왔습니다.
VC로는 테스트를 못해봐서 어떻게 나올지 모르지만
컴파일러 마다 다르다...가 정답일 듯 합니다.
함수 내의 지역 변수인데...
함수 내의 지역 변수인데 다르게 나오기도 하나요?
armcc 이든 gcc이든 둘 다 stack을 사용할 것 같은데 아닌가요?
원래
{0,} 로 초기화하는 것은 지역변수에서 초기화하는 것입니다.
전역변수는 0 으로 초기화되도록 되어 있기 때문입니다.
{0,} 으로 초기화하면 컴파일러는 필요한 0 의 갯수만큼 0 값을 데이터 세그먼트 등에 보관하여야 하므로 파일 사이즈가 커지는 것입니다.
............................
지역변수로 char c[2000] 와 같은 약간(?) 큰 사이즈의 배열 선언은 스택 사이즈에 따라서 오류를 가져올 수도 있습니다. 이런 경우는 malloc 또는 calloc 을 쓰는 것도 좋은 방법입니다.
댓글 달기