lkbin95   7년 전

#include<stdio.h>
#include<stdlib.h>
int add(int num,...)
{
int a, b, anw=0;
int* point=NULL;

point=&num+1;

for(a=0;a<=num;a++)
{
anw+=point[a];

}

return anw;
}
int main()
{
int a, b, c=0;


a=add(5, 1, 2, 3, 4, 5);

printf("%d \n", a);

a=add(9, 1,2,3,4,5,6,7,8,9,10);

printf("%d \n", a);

b=add(6,1,2,3,4,5,6,7,8,9);//이건 일부로 틀린값 주고 결과값이 어떻게 나오는지 한번 볼려고 추가해 놓은 부분입니다.

printf("%d \n", b);

}


코드는 그냥 가변인자 함수로 결과값 밭아서 다 더하는 형태입니다.


그런데 VS에서는 잘만 동작하는게 GCC로 하니까 쓰레기값만 뱉어냅니다.

VS는 C++ 2010 express 고 GCC는 구름 IDE입니다. 이거 


yukariko   7년 전

add(6,1,2,3,4,5,6,7,8,9);//이건 일부로 틀린값 주고 결과값이 어떻게 나오는지 한번 볼려고 추가해 놓은 부분입니다.

그 위에 a=add(9, 1,2,3,4,5,6,7,8,9,10); 도 잘못된 입력 같은데요?

add 코드의 for(a=0;a<=num;a++) 를 보면 입력을 9를 줬을때 10개까지 처리하는게 맞긴한데..

그럼 a=add(5, 1, 2, 3, 4, 5); 이부분이 잘못된것 같습니다.

lkbin95   7년 전

제가 막힌 문제는 그게 아닙니다.

왜인지는 모르겟지만 GCC에서 컴파일한 경우에는 저 3경우 싹다 전혀 상관없는 쓰레기값을 뱉어내고 있습니다.


의도한 대로라면 

15

55

28

이 결과값으로 나와야 하고 VS에는 의도한 대로 뜨는데 GCC환경에서는 3경우 다 랜덤한 쓰레기값을 내뱉고 있습니다.

yukariko   7년 전

가변 인자의 올바른 사용법은 stdarg.h 에 있는 va_start, va_end, va_arg를 이용하는것입니다.

지금의 코드는 인자가 메모리 상으로 연속해 있다는 보장이 없기 때문에 값 또한 보장이 되지 않는것입니다.

lkbin95   7년 전

지금까지는 그냥 보고있던 책에 나온대로만 해봐서 그런지 그렇게 해야되는지 몰랐네요.


그런데 VS랑 GCC랑 결과물이 차이나는건 무슨 이유인지 알수 있을까요. 코드가 잘못된거라면 아예 컴파일 과정에서 에러가 나오거나 둘다 쓰레기값만 나와야 되는거 아닌가요?

yukariko   7년 전

보장이 되어있지 않다는것은

컴파일러에 따라 다르게 동작할 수 있다는것을 의미합니다.

VS 컴파일러 에서는 그런식의 구현이 되어있고, GCC 컴파일러에서는 그렇지 않다고 보시면됩니다.


댓글을 작성하려면 로그인해야 합니다.