일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 연결리스트 정렬
- 수학
- 구현
- LeetCode 83 c언어
- 스택
- 실패함수
- Queue
- 정렬
- KMP알고리즘
- 조합론
- 연결리스트 중복제거
- 별 찍기
- 임의 정밀도 / 큰 수 연산
- 재귀
- 큐
- 해시를 사용한 집합과 맵
- 브루트포스 알고리즘
- 다이나믹 프로그래밍
- LeetCode 83번
- 사칙연산
- 문자열제곱
- 문자열
- 프로그래머스
- 시뮬레이션
- LeetCode Remove Duplicates from Sorted List in c
- 이분 탐색
- 정수론
- 자료 구조
- 유클리드 호제법
- 큰 수 연산
- Today
- Total
hahn
[C] size_t, ssize_t 본문
개요
//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는 특정 자료형을 재정의해준 것으로 시스템에 따라 가변적이다.
'개발 공부 > C' 카테고리의 다른 글
[C] read() (0) | 2022.01.01 |
---|