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

김동훈님의 프로필 이미지
김동훈

작성한 질문수

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

strcpy 함수를 쓰는 이유

작성

·

1.2K

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 를 써야하는 이유가 있나요?

답변 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 등을 이용해 복사를 해야 합니다. 

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

감사합니다.

 

김동훈님의 프로필 이미지
김동훈

작성한 질문수

질문하기