char str[] = "Hello";
- 배열 스택에, 할당된 문자열 데이터는 힙에
const char *str = "Hello";
- 포인터는 스택에, 문자열 상수는 정적 메모리에
char *str = new char[6];
- 포인터는 스택에, 할당된 문자열 데이터는 힙에
ps>
str_instance << std::string 타입의 객체고 스택에 저장
"Hello" << 할당된 문자열 데이터는 힙에
str_4 << 포인터는 스택에
string str_instance = "Hello"; // std::string 타입의 객체고 스택에 저장. std::string 클래스는 동적 메모리 할당을 내부적으로 관리하므로, 개발자가 직접 메모리 해제를 신경 쓸 필요가 없다
string *str_4 = &str_instance; // 포인터로서, 스택에 저장
비교 1
char *p[10] VS string *p[10]
비교 2
char s[] = "geeksquiz"; VS char *s = "geeksquiz";
ex) 예제
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
typedef typename std::string string;
int main()
{
// 1
char str_1[] = "Hello"; // 스택에 할당
str_1[0] = 'h'; // "hello"로 변경 가능
cout << str_1 << endl; // 출력 : hello
// std::cout 스트림은 char 포인터 타입의 인자를 전달받을 때, 널 종료 문자('\0')가 나타날 때까지 연속된 문자들을 출력하는 것으로 정의됨
// 함수가 끝나면 str 배열은 자동으로 해제됨
// 2
const char *str_2 = "Hello"; // 포인터는 스택에, 문자열 상수는 정적 메모리에
// str_2[0] = 'h'; // 컴파일 오류 : assignment of read-only location ‘* str_2’
cout << str_2 << endl; // 출력 : Hello
// 함수가 끝나면 포인터 str은 해제되지만, "Hello" 문자열 상수는 남아 있음
// 3
char *str_3 = new char[6]; // 포인터는 스택에, 할당된 문자열 데이터는 힙에
strcpy(str_3, "Hello");
// *str_3 = "Hello"; // 컴파일 오류 : invalid conversion from ‘const char*’ to ‘char’
// ... 사용 후에 메모리 해제 필요
str_3[0] = 'h'; // "hello"로 변경 가능
cout << str_3 << endl; // 출력 : hello
delete[] str_3; // 힙 메모리 해제
// 함수가 끝나면 포인터 str은 해제되지만, 힙에 할당된 메모리는 delete[]로 해제해야 함
// 4
string str_instance = "Hello"; // std::string 타입의 객체고 스택에 저장. std::string 클래스는 동적 메모리 할당을 내부적으로 관리하므로, 개발자가 직접 메모리 해제를 신경 쓸 필요가 없다
string *str_4 = &str_instance; // 포인터로서, 스택에 저장
*str_4 = "bye";
cout << *str_4 << endl; // 출력 : bye
// 모든 변수들이 스택에 저장되므로 스코프가 끝나면 자동으로 메모리가 해제됨.
return 0;
}
'언어 정리 > C++_개념_lib' 카테고리의 다른 글
정적변수, 전역변수 (0) | 2024.01.16 |
---|---|
this, function return 자료형 (0) | 2024.01.16 |
스마트 포인터, casting (1) | 2024.01.03 |
typedef (0) | 2024.01.03 |
#if, 초기화리스트, const, namespace (0) | 2024.01.02 |
댓글