c 변수 선언에 대한 질문입니다.-_-a
안녕하세요,눈팅만 하다 질문글 겨우 올리는 piloteer라 합니다.
최근 몇년간 c를 만지지 않아서 까먹은 상태에서, 어떤 분을 도와드리다 나온 이야기인데,
int a[M][N],i,j,sum=0; 로 선언할 시 전 a를 제외한 모든 변수가 0으로 선언된다고 말했었습니다.
...기억이 흐트러져서 삑사리를 낸건지는 모르겠지만.
그런데, 어떤 분이 말씀하시길-
#include
#define M 3
#define N 4
int main(){
int a[M][N],i,j,sum=0;
printf("%d %d %d %d \n",a[M-1][N-1],i,j,sum);
}
134518140 -1208980032 134513641 0 이렇게 나왔습니다. a[M-1][N-1], i, j, sum 순서입니다. 당연한 말이지만 값을 지정하지 않으면 가비지값이 나오게 될 것입니다.
.......랍니다. 제 생각과 틀리지요. 하지만 전 오래 코딩을 안 했기 때문에 이쪽이 더 일리 있다 싶어서 확인차 짜다 돌려봤는데-
dirk@dirk-desktop:~$ vim test2.c
#include stdio.h - 대괄호를 치면 글을 테그로 인식하는군요. 이뭐 -_- 괄호 뺏습니다.
#define M 3
#define N 4
int main()
{
int a[M][N],i,j,sum=0;
printf("%d %d %d %d \n",a[M-1][N-1],i,j,sum);
}
dirk@dirk-desktop:~$ gcc test2.c -o test2
dirk@dirk-desktop:~$ ./test2
0 0 0 0
dirk@dirk-desktop:~$ ./test2
0 0 0 0
dirk@dirk-desktop:~$ ./test2
0 0 0 0
dirk@dirk-desktop:~$
이렇게,전부 다 0이 나왔습니다.
이게 어떻게 되서 이렇게 출력된건지 설명을 들을 수 있으면 좋겠습니다._-_
점점 햇갈려집니다.
조금 내용에 보충해서-
http://gigglehd.com/zbxe/?mid=bbs&document_srl=337558&rnd=337735&comment_srl=337711#comment_337735
여기서 하고 있는 대화를 참고해 주시면 더 자세하게 이해하실 수 있으실 겁니다.
감사합니다.
gcc4.2.3, kubuntu8.04에서
gcc4.2.3, kubuntu8.04에서 실행결과 134518156 -1208255040 134513657 0 가 나왔습니다.
표준이 아닌건 확실하고, 전부 0이 나온건 컴파일러확장일듯하네요.
네.
일단 제가 오래 코딩을 안해서 다 까먹었고 가비지값이 나오는게 정상인거 같습니다.
혹시 x64용 리눅스를 쓰는게 차이가 나는지는 모르겠습니다만 -_-; 불행히도 그 분의 컴퓨터와 제 컴퓨터의 환경 차이는 이정도밖에 안 보입니다.
x64용 리눅스를
x64용 리눅스를 쓰는거보다 중요한건 무슨 컴파일러를 쓰냐는 거죠.
코드는 컴파일러가 만들어내니까요.
같은 gcc라고 해도 표준이 아닌 부분이라면 버전에따라서 동작방식이 다른 경우도 있구요.
가비지값이 들어간다고 가정하고 코딩하는게 맞습니다.
어떤 컴파일러가 어떤 실수를 허용해주는지 궁금하신지는 모르겠습니다.
하지만 코딩을 할 때에는 저런 경우 가비지값이 들어간다고 가정하는게 맞습니다.
예전에 누군가가 포트란(f77)에서 짠 소스코드를 받은 적이 있었습니다.
코딩하신 분이 나이드신 원자물리학자셨는데 전문 프로그래머가 아니시다 보니
컴파일러에서 허용하는 범위 내에서 아주 자유롭게(?) 코딩을 하셨습니다.
그래서 원래 코딩한 윈도우용 컴팩 포트란에서는 컴파일이 되었는데
리눅스의 g77이나 gfortran에서는 아무리 해도 정상적인 컴파일이 안되더군요.
리눅스에서 컴파일한 코드에서는 다른 결과가 나왔습니다.
컴파일러에서 이것저것 허용해주는 것이 도리어 사람들과 소스코드를 나쁜 길로 이끄는 것 같습니다.
감사합니다:)
감사합니다:)덕에 확실해졌습니다.
댓글 달기