본문 바로가기
배운 것들 메모/따라 배우는 C언어

[홍정모의 따라하며 배우는 C언어] 4.4 strlen() 함수 메모

by 야속한 낭만 2024. 8. 10.

2024-05-14

 

빈 칸과 \0(NULL) 다르다.

strlen 기능

strlen은 NULL charter(\0)를 자동적으로 빼주기 때문에, 순수하게 문자가 몇 개가 있는 지 알려준다.

\n 그리고 escape sequence (각각 줄바꿈, 빈 칸)같은 경우도 strlen에서는 글자 한 개로 취급된다.

빈 칸인 space도 글자 한 개로 취급

 

 

size_t는 객체의 크기나 배열의 요소 개수 등을 표현하는 데에 사용되는 타입.

%zu는 부호 업슨 정수 타입인 size_t를 출력하기 위해 상요되는 형식 지정자이다.

#include <stdio.h>
#include <string.h>

int main() {
    const char* str = "Hello, World!";
    size_t length = strlen(str);

    printf("문자열의 길이: %zu\\n", length);

    return 0;
}

 

동적할당 간단한 예

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
	char* str5 = (char*)malloc(sizeof(char) * 100);
	str5[0] = 'H'; str5[1] = 'e'; str5[2] = 'l'; str5[3] = 'l'; str5[4] = 'o';
	str5[5] = '\\0';
	printf("% zu % zu\\n", sizeof(str5), strlen(str5));

	return 0;
}

 

동적할당이라는 데, 솔직히 완벽히 이해를 못했다. 

 

그러나, 여기서 확실히 알고가자!

인프런 4.4 강의 따배씨에서 답변

 

 

위의 내용을 요약하자면

* 은 포인터인데 보통 int의 크기를 가지고 있다.

위처럼 동적으로 할당한 메모리 같은 경우는 데이터의 크기가 ‘포인터 변수 자체’가 출력됨.

따라서 sizeof(str5)은 4byte or 8 byte(int크기)가 출력된다.

 

그러니까 쉽게 말하자면, 보통 sizeof의 동작은 이렇게 된다.

sizeof(포인터) -> 포인터 주소의 자체 크기

sizeof(배열) -> 배열 전체의 메모리 크기

 

그런데 이번 꺼는 malloc 때문에 동적(動的)으로 할당된 메모리라는 거임. 

 

대충 그냥 100 바이트 크기의 메모리가 할당받았는데, 이 그림으로 표현하자면.

그림으로 설명

 

이런거다.

뭔가 배열처럼 생겼지만, 배열이 아니다.

따라서 str5[0]은 배열처럼 생겼지만, 0번째 메모리 공간에 접근한다는 것이고, H를 할당했다.

 

따라서, sizeof(str5)은 포인터의 주소 크기인 4byte 또는 8byte 가 출력된 것이고,

strlen은 str5가 가지고 있는 문자열의 길이 즉, Hello의 길이인 5가 출력된 것이다.

 

출처:  홍정모의 따라배우는 C언어

강의 외의 추가된 것들은 책 그리고 인터넷 조사해서 얻었음