c언어 struct 질문있습니다

2019. 04. 12. 14:55

14. 다음과 같은 문장을 수행하고 난 뒤의 a.field1의 값은?

struct test { int field1; };

void sub(struct test b)

{ b.field1 = 1;}

void main()

{ struct test a={ 0 }; sub(a); }

(1) -1 (2) 0 (3) 1 (4) 2

15. 다음과 같은 문장을 수행하고 난 뒤의 a.field1의 값은?

struct test { int field1; };

void sub(struct test *b)

{ b->field1 = 1; }

void main()

{ struct test a={ 0 }; sub(&a); }

(1) -1 (2) 0 (3) 1 (4) 2



두 문제 답이 왜 다른지 구체적이고 자세하게 초보자의 관점에서 설명해주세요ㅠㅠㅠ 그리고 struct test a={ 0 }은 현재 struct를 초기화하고 있는건가요?

공유하고 보상받기 ♥︎

총 2개의 답변이 있습니다.

질문자 채택 답변

14번 문제

struct test
{
    int field1;
};

void sub(struct test b) // (아래 main부터 보고 오세요)
{ // main에서 a의 값을 b에 받아왔습니다.
    b.field1 = 1; // b의 field1을 변경했습니다.
} // 하지만 b는 a와 별개의 변수입니다. 값을 a에서 복사했을 뿐입니다!

void main()
{
    struct test a = { 0 }; // 여기서 a.field1이 0입니다.
    sub(a); // sub 함수에 a를 넘길 때, a를 복사해서 넘깁니다.
} // 복사해서 넘긴 값을 아무리 지지고 볶아도 원래의 값은 그대로입니다.

15번 문제

struct test
{
    int field1;
};

void sub(struct test *b) // (아래 main부터 보고 오세요)
{ // main에서 a의 주소를 받았습니다. 이제 원본 a의 값을 바꿀 수 있습니다.
    b->field1 = 1; // 아까 그 a의 field1을 1로 바꿨습니다.
} // 이제부터 main에서 넘긴, 그 a의 field1도 1입니다.

void main()
{
    struct test a = { 0 }; // 여기서는 a.field1이 0입니다.
    sub(&a); // sub 함수에 a의 주소를 넘겼습니다!
}
2019. 04. 12. 15:13
50
M사 / 연구소-SW팀

올리신 저 두 문제의 중점은 함수 Parameter(param)로 값을 넘길 것이냐 ? 아니면 주소를 넘겨줄 것이냐? 입니다.

Call by value (값에 의한 호출)

Call by reference (참조에 의한 호출)

이런용어를 쓰지요.

14번은 Call by value

15번은 Call by reference

를 설명하려고 만들었나보네요.

14번의 a 의 주소를 0x00이라고 가정 할 경우 함수 Sub 의 내부로 들어가면 b 의 주소는 0x00이 아닙니다. 전혀 다른 메모리 주소이죠. 그래서 Sub 함수 가 끝나면 그 주소는 사라져서 값의 변화가 없습니다. 반면 15번은 a의 주소로 넘겨주기때문에 함수 내부로 들어가도 b는 0x00을 가리키게되죠!

다른 분들은 어떻게 쓰는지 모르겠지만 저 같은 경우 대부분 포인터를 넘겨서 씁니다.

2019. 04. 12. 22:46
34