구조체 관련 질문
323
작성한 질문수 9
안녕하세요. 잘 이해가 되지 않은 부분이 있어서 질문 드립니다.
<질문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)
네, 그렇습니다 :)
Export template 안됨
1
45
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
71
3
main 함수에서 왜 int만 선언이 되는걸까요
1
63
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
62
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
58
1
프로토타입과 함수간의 인자 불일치
1
81
2
12.12 헤더 관련 질문
1
63
2
Visual Studio Community 2026 사용 문의
1
149
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
65
2
getchar(), putchar()
1
96
3
강의자리ㅛ
1
85
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
119
2
소스파일안에 여러 파일
1
80
2
F5와 F7의 차이
1
82
2
c = TWO * (a+b); 에서 a와 b는?
1
63
2
; 세미콜론을 붙이는 기준에 문의
1
73
1
Step over 기능 문의
1
57
2
2.6 강의 따옴표 출력 규칙 문의
1
81
2
int main 함수 관련 오류 문의
1
71
2
13.4 words[0]
0
64
2
11.7 함수를 구현해 봤습니다.
1
66
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
67
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
57
2
11.6 fit_str함수를 구현해 봤습니다.
1
56
2





