hahn

[C] size_t, ssize_t 본문

개발 공부/C

[C] size_t, ssize_t

hahn 2021. 12. 17. 02:46
728x90
반응형

개요


//strlen의 프로토타입

#include <string.h>

size_t strlen(const char* str);

 

과제를 진행하다보면 size_t라는 자료형이 되게 많이 나왔다.

 

당시에는 그냥 unsigned int랑 똑같은데 size와 관련되어 사용되는

 

자료형을 size_t라 부르기로 약속한 걸로 알고 사용했었다.

 

실제로 아래와 같이 substr 구현할 때 size_t와 int를 비교는 unsigned int로 캐스팅했었다.

//내가 구현한 substr

#include <stdlib.h>

char	*ahn_substr(char const *s, unsigned int start, size_t len)
{
	char* output;
	int idx;
	int size;

	idx = 0;
	size = ft_strlen(s) - start;
	if (size < 0)
	{
		output = (char *)malloc(sizeof(char) * 1);
		output[0] = '\0';
		return (output);
	}
	if ((unsigned int)size < len)
		len = size;
	output = (char *)malloc(sizeof(char) * len + 1);
	if (!output)
		return (0);
	while (start-- && *s)
		s++;
	while (len-- && *s)
		output[idx++] = *(s++);
	output[idx] = '\0';
	return (output);
}

하지만 이번 과제를 진행하다가 read 함수를 사용할 일이 있었는데

 

프로토타입의 반환형이 ssize_t인걸 보고 오타인가? 하고 확인했는데

 

//read 함수의 프로토타입

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t nbytes);

진짜 ssize_t길래 이참에 뭔지 알아보고자 찾아봤다.


내용


size_t 와 ssize_t는 primitive(고전적인) 자료형으로 sys/type.h과 같은 헤더나 c에서는 typedef를 통해 선언되어 있다.

 

즉 원래 존재하는 int, long을 통해 이름만 바꿔 정의를 해뒀다는 것이다.

 

이는 기술이 발전하게 되면서 int형의 크기가 변하게 되었고,

 

이에 따라 코드의 수정이 필수적으로 요구되기에 sys/type.h와 같은 헤더 파일에 있는

 

size_t 와 ssize_t를 재정의 한 뒤, 컴파일을 다시 해주면 코드를 재작성하지 않고,

 

원활하게 사용할 수 있다는 이점이 있기에 새로운 이름을 지어준 것이다.

 

실제로 _t는 typedef 했다는 의미이다.

 

ibm.com의 types.h file docs의 size_t와 ssize_t

size_t Data type is used for sizes of objects.
ssize_t Data type is used for a count of bytes or an error indication.

ibm.com z/os의 sys/types.h: _POSIX_SOURCE

size_t unsigned long
ssize_t Signed long

pubs.opengroup.org의 types.h속 size_t와 ssize_t

 

size_t shall be an unsigned integer type.

ssize_t shall be signed integer types.


결론


IO함수 (ex. read)는 실패여부를 -1로 반환하기 위해 signed int인 ssize_t를 사용한다.

 

size_t 와 ssize_t는 특정 자료형을 재정의해준 것으로 시스템에 따라 가변적이다.

728x90
반응형

'개발 공부 > C' 카테고리의 다른 글

[C] read()  (0) 2022.01.01