char str1[] = "Hello, World!";
char str2[kMaxStr]; // 초기화가 되지 않은 100글자가 들어갈 수 있는 배열
// str2 = str1; // 다짜고짜 대입하면 안된다!! Error
memcpy(복사 결과를 받을 주소, 복사 할 내용이 있는 주소, 두 개의 배열 중 더 작은 크기)
memcpy(str2, str1, Min(sizeof(str1), sizeof(str2)));
cout << str2 << endl; // Hello, World!
변수 사이즈가 포인터 사이즈
임 (배열이 아님)char *dynamic_array = new char[kMaxStr];
memcpy(dynamic_array, str1, Min(sizeof(str1), sizeof(kMaxStr)));
cout << dynamic_array << endl; // Hello, World!
cout << str1 << " " << str2 << " " << dynamic_array << endl; // Hello, World! Hello, World! Hello, World!
cout << size_t(str1) << " " << size_t(str2) << " " << size_t(dynamic_array) << endl; // 6170522088 6170521988 5098200048
delete[] dynamic_array; // 배열 삭제시 []
/*
홍정모 연구소 https://honglab.co.kr/
*/
#include <iostream>
#include <cstring>
using namespace std;
const int kMaxStr = 100; // 전역 상수
int Min(int a, int b)
{
return a < b ? a : b; // 조건연산자(삼항연산자)
}
int main()
{
// 문자열 복사
// 단점 : 크기를 변경할 수 없고, 아주 큰 메모리를 사용할 수 없다
// 왜냐하면 정적배열은 미리 메모리를 잡아놓기 때문에(stack overflow 발생 가능)
char str1[] = "Hello, World!";
char str2[kMaxStr]; // 초기화가 되지 않은 100글자가 들어갈 수 있는 배열
// str2 = str1; // 다짜고짜 대입하면 안된다!! Error
// dest, src 안내 (복사할 메모리 크기 주의)
memcpy(str2, str1, Min(sizeof(str1), sizeof(str2))); // 두 개의 배열 중 더 작은 크기를 복사
cout << str2 << endl; // Hello, World!
// 동적 배열 : 운영체제에게 나는 이만큼의 메모리가 필요하다고 요구하는데, 필요한 전체 크기를 운영체제에게 요구함
// char type의 데이터가 kMaxStr개 들어갈 만큼의 메모리 공간을 요청
// 그러면 운영체제는 '여기있는 메모리 사용하게 하면 되겠다' 하고 첫번째 메모리 공간을 줌
// 그러면 마치 배열처럼 사용할 수 있음
char *dynamic_array = new char[kMaxStr];
// 주의: 동적할당 메모리는 변수 사이즈가 포인터 사이즈임 (배열이 아님)
memcpy(dynamic_array, str1, Min(sizeof(str1), sizeof(kMaxStr)));
// memcpy(dynamic_array, str2, kMaxStr);
cout << dynamic_array << endl; // Hello, World!
cout << str1 << " " << str2 << " " << dynamic_array << endl; // Hello, World! Hello, World! Hello, World!
cout << size_t(str1) << " " << size_t(str2) << " " << size_t(dynamic_array) << endl; // 6170522088 6170521988 5098200048
// 보통 크기를 별도로 저장함
// 다 사용한 메모리 혹은 더이상 사용하지 않을 메모리는 운영체제에게 반납해야함
// 이미 운영체제는 메모리를 얼마나 줬는지 알기 때문에 굳이 메모리 크기를 적을 필요가 없다
delete[] dynamic_array; // 배열 삭제시 []
// 지우지 않고 재할당할 경우 잃어버림
// dynamic_array = new char[원하는크기];
// delete[] dynamic_array; 다시 지워줘야 함
return 0;
}
출처 : 홍정모 유튜브