작성
·
170
0
안녕하세요 홍정모 교수님!!
질문이 있어서 여쭤봅니다.
#define SIZE 5
int main()
{
int my_arr[SIZE];
int sum = 0;
printf("Enter 5 numbers : ");
for (int i = 0; i < SIZE; ++i)
{
scanf("%d", &my_arr[i]);
sum += my_arr[i];
}
printf("Sum = %d", sum);
return 0;
}
제가 구현한 코드입니다. 불드친 부분을 제가 my_arr 로 했을때는 sum의 값이 이상하게 출력이 되는데, 그 이유를 알고 싶습니다!! 강의에서는 &my_arr[i]와 my_arr를 같이 써도 무방하다고 하셨다고 제가 이해를 했습니다만, 어디가 어떻게 잘못되었는지 궁금합니다.
항상 좋은 강의 감사드립니다.
답변 2
2
안녕하세요.
우선 이 답변은 아마 질문자님께서 포인터와 배열의 관계에 대해서 배우시고 나서야 이해가 가실 것 같습니다. 그래서 만약 제 답변이 이해가 되지 않으시다면 나중에 포인터까지 공부 하시고 다시 보시면 됩니다!
&my_arr[i]와 my_arr 가 같은 것이라기보단 my_arr 와 값이 같은 것은 &my_arr[0] 입니다. 배열의 이름(my_arr)은 배열의 첫번쨰 원소의 주소가 담겨져 있는 포인터와 같은 역할을 하기 떄문입니다. (아마 포인터 모르시면 제가 말씀드리는 이 부분이 이해가 잘 안되실텐데 나중에 포인터 공부하시면 이해되실거에요!)
그리고 배열의 모든 원소들을 입력하려고 하시는건데 &my_arr[i] 가 아닌 그냥 my_arr 이라고 하시면 for문의 i++ 을 영향을 못 받습니다. i는 0부터 SIZE -1 까지 증가 되면서 my_arr[0], my_arr[1] ... 이렇게 모든 원소에 입력을 할 수 있게 되는건데 그냥 my_arr 로만 적으시면 for문 도는 동안 원소들이 아닌 my_arr 에만 고정적으로 입력받겠다고 하시는거라 모든 원소들이 아닌 for문 도는 내내 my_arr[0] 첫번째 원소에만 입력을 받는 꼴이 됩니다.
따라서 질문자님께서 scanf("%d", my_arr);라고 하셨다면 이는 for문 도는 동안 내내 첫 번째 원소에만 입력을 받으신 셈이 됩니다. 따라서 첫번쨰 원소를 제외한 나머지 원소들은 입력이 되지 못해 쓰레기 값으로 남아있고 이 쓰레기값들과 합산을 하였기 때문에 이상한 값이 나온 것입니다.
for문을 모두 실행 완료한 후 빠져나왔을 떄 모습입니다. 이렇게 첫번째 원소만 입력 된 것을 확인하실 수 있습니다.
0