카테고리 없음
스트링의 크기와 문자열의 null문자
시코.
2024. 2. 24. 22:28
728x90
https://www.inflearn.com/questions/91707/string%EC%9D%98-%ED%81%AC%EA%B8%B0
//no warning이건 순서가 cstdio 위에있어야 적용됨 코드는 위에서부터 실행된다
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
int main()
{
// string의 크기가 40바이트라는 내용을 알게 되었다
//https://www.inflearn.com/questions/91707/string%EC%9D%98-%ED%81%AC%EA%B8%B0
// 내용을 살펴보니 여러 포인터와 공용체로 인한 크기였다
//
//string의 경우 사이즈멤버 변수는 문자열 갯수와 동일하고
//널 문자는 제외하고 센다(문자열데이터에는 있긴 있다)
//
//string 안의 bx라는 공용체에 짧은 문자열은 직접 버퍼에 넣고
//긴 문자열은 포인터에 넣어둔다
// 공용체 https://learn.microsoft.com/ko-kr/cpp/cpp/unions?view=msvc-170
//
// string에 문자열 리터럴 대입 초기화 시
//basic_string() noexcept(is_nothrow_default_constructible_v<_Alty>) : _Mypair(_Zero_then_variadic_args_t{}) {
// _Mypair._Myval2._Alloc_proxy(_GET_PROXY_ALLOCATOR(_Alty, _Getal()));
// _Tidy_init();
//}
// 라는 코드가 실행된다 신기하다.
//
//
//문자열에는 무조건 뒤에 \0가 붙는다
//
//
// 살펴보던중 constexpr 라는 키워드를 발견했다
//const와 유사한 부분이 많다 https://modoocode.com/293
//
// 그리고 템플릿코드라는걸 알게 되었다 https://modoocode.com/295
// 두렵다
//
//
//
const char* character = "hell";
//문자열에 이미 널값이 있어 직접 char배열에 넣으려면
//한자리 더 할당해 줘야 한다 string에서는 이런 부분은
//편의상 직관적으로 하기 위해 size 와 capacity 의 비교에서 null을 제거한것 같다
const char character_arr[5] = "hell";
const std::string string = "hell";
const std::string string_numbers_for_size_check__is_including_null_const =
"012345678912345";
//스트링 기본 용량 15 15자 넣고 사이즈가 15 되어도 용량 안늘어남 16되니까 늘어남
std::string string_numbers_for_size_check__is_including_null = "123456789012345";
//30자리 스트링
std::string string_numbers_for_size_check__30 = "12345678901234512345678901234567890";
//raw data 안의 bx 라는 공용체확인 해 봄
std::string string_size_check_5 = "12345";
std::string string_size_check_14 = "12345678901234";
//스트링 기본 용량 15 15자 넣고 사이즈가 15 되어도 용량 안늘어남 16되니까 늘어남
std::string string_size_check_15 = "123456789012345";
std::string string_size_check_16 = "1234567890123456";
char* character_cin = new char[10];
char* character_scanf = new char[10];
std::string string_cin;
std::string string_scanf;
std::cin >> character_cin;
scanf("%s", character_scanf);
std::cin >> string_cin;
scanf("%s", string_scanf);
std::cout <<
"string size: "<< sizeof(std::string) << std::endl <<//40
"string pt size: "<< sizeof(std::string*) << std::endl <<//8
"string var size(const'hell'): "<< sizeof(string) << std::endl <<//40
"string var size(cin input): "<< sizeof(string_cin) << std::endl <<//40
"string var size(scnaf input): "<< sizeof(string_scanf) << std::endl <<//40
"char size: "<< sizeof(char) << std::endl <<//1
"char pointer size: "<< sizeof(char*) << std::endl <<//8
"char pointer var size(const'hell'): "<< sizeof(character) << std::endl <<//8
"char pointer var size(cin input): "<< sizeof(character_cin) << std::endl <<//8
"char pointer var size(scanf input): "<< sizeof(character_scanf) << std::endl <<//8
//40 값이 커지면 스트링도 커질 줄 알았는데 다른곳에
//값이 할당되고 포인터만 가지고 있는듯 하다
"string check is need null for end?: " <<
sizeof(string_numbers_for_size_check__is_including_null) << std::endl <<
//30길이 스트링 값이 커져도 40바이트 고정이다
"30 string: " << sizeof(string_numbers_for_size_check__30) << std::endl <<
std::endl;
}
728x90