Game Develop

[C++] memcpy 사용해서 char배열 복사 본문

C++/C++

[C++] memcpy 사용해서 char배열 복사

MaxLevel 2022. 11. 19. 01:18

알다시피 문자열의 끝은 반드시 \0이 있어야한다.

그렇기 때문에 어떠한 문자열을 저장하는 char 배열을 선언할 경우, 반드시 문자의 개수보다 1개 더 크게 잡아야한다.

maxlevel 은 8글자이지만, 배열의 크기는 최소 9로 잡아줘야한다.

 

char cArray[9] = "maxlevel"; 

 

문자개수와 똑같은 크기인 8로 선언할 경우, 컴파일에러가 발생한다. 

 

컴파일시점에서 반드시 문자열의 끝에는 \n이 있어야한다고 보장해줘야한다는 의미이다.

 

만약, maxlevel이라는 문자열의 앞 3글자 max를 low로 바꿔서 최종적으로 lowlevel이라는 문자열을 만드는게 목적이라면,

아래와 같이해야한다.

 

char a1[9] = "maxlevel";
char a2[] = "low";
memcpy(a1, a2, sizeof(char) * 3);

---> lowlevel 출력.

 

a2 메모리의 앞에서 3바이트만큼만 a1의 앞에서 3바이트랑 교체한것이다.

만약, 아래와 같은 코드라면?

 

char a1[9] = "maxlevel";
char a2[] = "low";
memcpy(a1, a2, sizeof(a2));

---> low 출력.

 

 

이건 왜 low만 출력하는걸까?

왜냐하면 sizeof(a2)는 결과값이 4이기 때문이다.

a2라는 변수의 메모리는 low만 있는 3바이트가 아니라 \0까지 포함한 4바이트이다.

즉, 위 memcpy함수를 수행할 경우 a1의 내용물은 아래와같이된다.

 

a1 == "l o w \0 e v e l \0"

 

 

 

3번째 인덱스에 \0이 있는걸 확인할 수 있다.

그리고 cout이라는 표준스트림출력객체는, \0을 만날때까지의 문자만 콘솔에 출력한다.

그렇기때문에 콘솔에는 low만 출력된다.

 

'C++ > C++' 카테고리의 다른 글

[C++] 프로세스 메모리 세그먼트들  (0) 2022.11.19
[C++] 문자열리터럴  (0) 2022.11.19
[C++] erase()와 iterator  (1) 2022.11.15
[C++] Iterator (반복자)  (0) 2022.11.02
[C++] vector  (0) 2022.11.01