강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

새싹비빔밥님의 프로필 이미지
새싹비빔밥

작성한 질문수

홍정모의 따라하며 배우는 C언어

14.9 구조체와 할당 메모리

14.9 5분경(Recommended usage 이하 내용)에서 동적할당 메모리와 strcpy 함수에 관해 질문드립니다.

해결된 질문

작성

·

88

1

안녕하세요, 강의를 듣던 중 강의 내용에서 5분 경~ Recommended usage 부분에 나오는 설명에서 의문이 생겨 질문 드립니다.

 

// 위 내용 생략

struct namect p = { "JeongMo","Hong" };
printf("%s %s", p.fname, p.lname);

 // Recommended usage

char buffer[SLEN] = { 0, };
int f2 = scanf("%[^\n]%*c", buffer);
p.fname = (char*)malloc(strlen(buffer) + 1);
if (p.fname != NULL)
    strcpy(p.fname,buffer);
printf("%s %s\n",p.fname,p.lname);

struct namect p로 구조체의 메모리가 할당되며 p.fname = "JeongMo", p.lname = "Hong" 값이 저장되었다고 이해했습니다.

 

이후 들어오는 값을 저장할 임시 버퍼역할의 string 변수 buffer가 선언되고, scanf를 통해 buffer에 string 값이 입력된다고 이해했습니다.

 

질문 1)
이후 p.fname = (char*)malloc(strlen(buffer) + 1); 로 동적 할당 메모리가 p.fname에 주어졌는데, 위에서 p.fname은 이미 "JeongMo"가 저장되어 있는 메모리 공간이 할당된 상태 아닌가요? 원래 저장되어 있던 값은 날라가고 동적 할당 메모리가 새로 배정된다고 이해하면 되는 건가요? 이미 할당된 메모리가 있는 구조체 변수에 동적 할당 메모리를 줄 수 있는건지, 값의 처리가 어떻게 되는 건지 궁금합니다.

질문 2)
p.fname에 동적 할당 메모리의 포인터 값이 잘 들어왔을 시(if (p.fname!=NULL) strcpy로 buffer에 있는 새로 들어온 string 값을 p.fname에 복사해줬는데, scanf로 값을 입력받는 건 불가하면서 strcpy로 값을 복사하는 건 왜 가능한건지 정확히 알고 싶습니다. strcpy 함수 내 인자의 타입이 char*이라 그런건가요?

기초적인 질문일 수도 있지만 아직 많이 헷갈리네요 ㅠㅠ 질문이 길어 답변이 힘드실 수 있지만 기다리고 있겠습니다. 감사합니다.

답변 1

1

안녕하세요? 질문&답변 도우미 durams입니다.

두 질문 모두 이전 강의들과 이번 강의에서 소개가 된 개념들이네요. 그래도 질문자님의 이해에 도움이 될 수 있도록 힌트를 드리고자 합니다.


질문 1

문자열 리터럴은 read만 가능한 영역(정확히는 .rodata section)에 저장됩니다. 런타임에는 read-only code segment 영역에 올라가게 되죠. 그리고 그 내용은 실행 파일에 포함되어있습니다.

동작 할당 메모리는 런타임에 할당받는 공간입니다. 그 공간을 가리키는 포인터를 malloc이 반환하게 되고, 구조체의 멤버에 할당하면 p.fname이라는 포인터는 기존에는 read-only code segment에 있는 문자열 리터럴인 "Jeong-Mo"의 시작 주소를 가리키다가 힙의 특정 위치를 가리키도록 바뀌게 됩니다.

'원래 저장되어 있던 값이 날아간다'기보다는, 포인터가 가리키는 곳이 달라진다고 보는 것이 적절합니다.


질문 2

문자열 리터럴은 read-only입니다. 읽기는 가능하지만, 쓰는 것은 불가능하다는 것을 의미합니다. 당연히 복사하는 것도 가능합니다. 값을 건드리는게 아니니까요. 이는 인자 타입이 포인터인것과는 큰 관계가 없습니다.


더 궁금한 점이 있으시다면 질문 주세요.

아하 감사합니다!

새싹비빔밥님의 프로필 이미지
새싹비빔밥

작성한 질문수

질문하기