헷갈리는 함수와 연산자 malloc, length, strlen, sizeof, size
1. malloc함수
동적으로 메모리를 생성하는 함수
인자로 넘겨준 크기만큼 메모리를 생성하고 그 포인터를 반환한다.
malloc는 할당된 공간에 대한 void 포인터를 반환하거나 사용 가능한 메모리가 부족한 경우 NULL을 반환한다.
2. 헷갈리는 문자열 길이 구하는 함수 (+sizeof 연산자)
length() / strlen() / size() / sizeof()
- length() : Return length of string, 문자열의 길이를 반환하는 함수, string의 멤버함수
변수.length(), 단 char 문자열을 변수로 받는다면 사용할 수 없다.
size_t length() const noexcept;
- strlen() : 문자열의 길이를 구해주는 함수, 문자열을 구성하는 null(/0)문자를 제외한 문자의 개수를 반환한다.
공백 문자일 경우 0 반환. 단 string을 변수로 받는다면 사용할 수 없다.
우선 strlen()함수를 사용하기 위해서는 C는 string.h, C++은 cstring헤더를 추가해줘야 한다.
함수 원형 size_t strlen (const char* str);
const char* 타입의 문자열을 받아서 해당 문자열의 길이를 반환하는 함수.
size_t(unsigned integral type, 부호 없는 64비트 정수 혹은 부호 없는 32비트 정수를 의미하는 자료형)
- size()
strlen()함수와 기능이 완전히 동일하다고 생각. string의 멤버함수
Both string::size and string::length are synonyms and return the exact same value.
string::length - C++ Reference (cplusplus.com)
length() 메소드는 문자열의 길이를 나타내지만, size() 메소드는 해당 string 객체가 메모리에서 실제 사용하고 있는 크기를 나타낸다.
- sizeof 연산자 : 메모리 공간을 차지하는 byte수를 return 합니다. 자료형의 크기를 구할 때 사용한다.
string 자료형의 크기?
string은 vector<char>와 비슷한 방식으로 동적할당을 이용해 구현이 되었다.
typedef char *string; 즉 string은 char의 포인터 변수 커스텀타입
sizeof(string)하면 왜 39까지나오지 ? 8*5해서 40byte로 계산되었나보다.
왜 string 한 칸은 8바이트지? 포인터 변수는 32비트 운영체제에선 4바이트, 64비트 운영체제에선 8바이트를 의미한다.