작성
·
254
·
수정됨
0
안녕하세요. 잘 이해가 되지 않은 부분이 있어서 질문 드립니다.
<질문1>
struct my_class{
char* name;
int score;
}
int main()
{
struct my_class student;
student.name = (char*)malloc(sizeof(char) * 20 + 1);
student.score == (int*)malloc(sizeof(int));
scanf("%s %d", student.name, student.score)
이전에 구조체.멤버는 '주소'를 의미한다고 답변해주셨습니다. 근데 잘 이해가 되지 않은 부분이
위의 코드처럼 score에 대한 값을 받아올 때는 주소연산자(&)을 사용하지 않으면, 오류가 발생합니다.
구조체. 멤버가 배열의 경우에는 '주소'를 의미하고, 변수나 상수 등을 의미할 때는 '값'을 지칭한다고 이해해도 될까요?
<질문2>
구조체에서 문자열을 가진 변수를 선언할 때, 포인터보다 배열을 선호 한다고 하셨는데 그 이유가 정확하게 이해가 되지 않아서 질문 드립니다.
1)
포인터를 사용하게 되면, 포인터도 메모리를 차지하고, 동적할당 받은 메모리 영역도 있기 때문에 배열을 사용했을 경우보다 메모리 측면에서 비효율적이기 때문에 배열을 선호한다고 이해하면 될까요?
2)
소스코드에 직접 문자열을 입력하는 경우에는 해당 문자열이 메모리레이아웃의 text segment에 저장되어, 읽기 전용 모드이기 때문에 수정을 할 수 없다. 하지만, 할당 받은 메모리에 직접 입력을 받는 경우에는 힙 영역에 해당 데이터가 저장되기 때문에 수정 등이 가능하다. 라고 이해했는데 제대로 이해한 것인지 궁금합니다.
즉, <질문1>의 예시 코드처럼 name에 대한 메모리를 할당 받았을 때, 콘솔창에서 입력 받은 값은 힙 영역에 저장되고, 구조체 변수 student는 스택에 저장되어 힙에 할당된 name이 할당 받은 메모리를 가리키고 있는 것이 맞는지 궁금합니다!
감사합니다.
답변 1
0
<질문1>
네, 멤버가 배열일 경우에는 (첫 번째 원소의) 주소를 의미하고
변수나 상수일 경우에는 그 값자체를 가지고 있기에. 후자를 입력받기 위해 &를 사용해야 하는 것입니다.
<질문2>
1)
네, 포인터를 사용하면
(보통 문자열의 길이에 따라 동적으로 메모리를 할당해야 하는 경우가 많은데, 이럴때)
메모리 할당 및 해제 관리가 복잡해집니다.
반면에 배열을 사용하면, 문자열을 저장하기 위해 필요한 메모리만을 미리 할당하여 사용할 수 있고
실행 도중에 메모리를 재할당할 필요가 없어서 메모리 관리 면에서 더 효율적입니다.
따라서 문자열을 담는 변수를 선언할 때는, 배열을 사용하는 것이 보통 좋은 선택입니다.
유의하셔야 할 점은 그렇다고 꼭 무조건 배열만 써야 하는 것은 아닙니다.
상황에 따라 다른 경우가 있습니다.
가령 문자열의 길이가 변경될 가능성이 있는 경우에는 동적 메모리 할당이 필요하므로
포인터를 사용해야 할 수도 있습니다.
2)
네, 그렇습니다 :)