inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

strcpy 함수를 쓰는 이유

1435

김동훈

작성한 질문수 3

0

//구조체 변수 2개를 만들어서 각자의 책 제목과 번호를 설정해라. sub함수를 이용해서 printf 하기. 
 
#include <stdio.h> 
#include <stdlib.h>  //malloc 함수 사용하기 위해. 
#include <string.h>  //strcpy 함수 사용하기 위해. 
 
struct Book
{
int number;
char title[100];
};
 
void showbook(struct Book *p, int n)   
{
int i;
for (i=0;i<n;i++)
{
printf("책 번호: %d  책 제목: %s  \n", (p+i)->number, (p+i)->title); 
}
}
int main()
{
struct Book *p;  //구조체 포인터 설 정 
p=(struct Book *)malloc(2*sizeof(struct Book)); //구조체 변수 두개를 포함할 수 있는 메모리 할당. 
if (p==NULL)
{
printf("동적메모리 할당에 실패했습니다");
exit(1);
}
p->number=11;
p->title="C Programming";
//strcpy(p->title, "C Programming");  
(p+1)->number=22;
strcpy((p+1)->title,"Data structure");
showbook(p,2);
free(p);
return 0;
}

밑에서 7번째 문장에 원래 strcpy(p->title, "C Programming"); 이라는 함수 대신에 p->title ="C Programming" 이라고 설정하니 실행이 안됩니다. 왜 실행이 안되는 것인지 이유를 모르겠습니다.

꼭 strcpy 를 써야하는 이유가 있나요?

c

답변 2

2

_____________

구조체 변수를 포함할 수 있는 메모리를 할당할 때 멤버변수가 메모리를 점유하게됩니다.

이때 char title[100]; 이 초기화 되지 않은 상태로 메모리를 점유합니다.

  

1) p->title="C Programming"; 오류가 나는 이유

해당 구문이 의미하는 것은 p->title에 "C Programming"의 시작주소를 대입하는 것을 의미합니다.

하지만 p->title은 포인터 '상수'로 수정불가능한 Lvalue입니다.

수정 불가능한 Lvalue에 값을 대입하려하니 에러가 발생합니다.

즉, p->title이 가리키는 주소를 바꿀 수 없는 것 입니다.

 

2) strcpy는 가능한 이유?

strcpy는 아래와 같이 char*, char* 파라미터를 받습니다.

char *strcpy( char *dest, const char *src );

 

strcpy(p->title, "C Programming"); 는

포인터 변수 dest, src가 각각 p->title의 주소, "C Programming"의 주소를 가리킵니다.

이들을 이용해 포인터 dereferencing을 이용해 src의 각 문자를 dest에 차례로 복사하게됩니다.

0

강민철

안녕하세요,

C언어에서는 C++, Java처럼 string을 표현하는 자료형이 없습니다.

그렇기에 특정 변수 (문자 배열)에 문자열을 저장하는 등의 코드를 작성할 적에는

strcpy 등을 이용해 복사를 해야 합니다. 

여느 자료형처럼 = 로 할당할 수 없지요.

감사합니다.

 

Export template 안됨

1

63

2

완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.

1

88

3

main 함수에서 왜 int만 선언이 되는걸까요

1

78

2

8비트 2진수 변환시 왜 1을 더해야하나요?

1

74

2

혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?

1

78

1

프로토타입과 함수간의 인자 불일치

1

87

2

12.12 헤더 관련 질문

1

74

2

Visual Studio Community 2026 사용 문의

1

167

2

Q. 15:30, 부호가 있는 8비트 정수 질문

1

71

2

getchar(), putchar()

1

111

3

강의자리ㅛ

1

92

2

비주얼스튜디오코드로 공부해도 상관없나요?

1

127

2

소스파일안에 여러 파일

1

87

2

F5와 F7의 차이

1

90

2

c = TWO * (a+b); 에서 a와 b는?

1

67

2

; 세미콜론을 붙이는 기준에 문의

1

78

1

Step over 기능 문의

1

64

2

2.6 강의 따옴표 출력 규칙 문의

1

87

2

int main 함수 관련 오류 문의

1

76

2

13.4 words[0]

0

73

2

11.7 함수를 구현해 봤습니다.

1

67

2

11.6 직접 strcmp와 strncmp를 구현해 보았습니다.

1

71

2

11.6 my_strcat과 my_strncat을 구현해봤습니다.

1

60

2

11.6 fit_str함수를 구현해 봤습니다.

1

58

2