개념
ft_printf 뽀개기_2ㄹ
Subject
80000coding.oopy.io
[C / 42seoul / ft_printf] - 서식 지정자 (format specifier)
%[플래그][폭][.정밀도][길이]서식지정자 printf는 플래그, 폭, 정밀도, 길이 그리고 서식지정자를 조합하여 사용할 수 있는 함수이다. ft_printf 과제를 하기 위해 하나하나 뜯어봐야겠다. 서식지정자
infinitt.tistory.com
ft_printf
0. 프로젝트 개요
80000coding.oopy.io
[42서울 / ft_printf] ft_printf 정리
42서울 본과정 1circle ft_printf 정리문서
velog.io
[ft_printf](2)가변 인자 함수(variadic function)
이번 포스트는 가변 인자 함수(variadic function)에 관한 내용입니다. 1️⃣ 가변 인자 함수란? <반환형> <함수명>(<자료형이 고정된 매개변수>, . . . ); 매개변수(가변 인자)를 개수를
kirkim.github.io
개념 정리는 위 사이트에서 보는 것을 추천한다. 더 잘 정리되어있다.. ㅎㅎ
아래는 내가 헷갈렸던 부분만 따로 정리를 해놓았다.
가변 인자란?
우리는 지금까지
int add(int a, int b)
{
...
}
이런 식으로 인자를 전달해왔다. 근데 가변 인자란?
int something(int a, ...)
{
...
}
이 처럼 ... 으로 표시를 하고 어떤 타입의 변수가 개수와 상관없이 들어 올 수 있다는 뜻이다.
- 그럼 ... 인자는 어떻게 사용 하는 것일까?
- va_list: 가변 인자 목록. 가변 인자의 메모리 주소를 저장하는 포인터 변수 타입이다.
- va_start: 가변 인자를 가져올 수 있도록 포인터를 설정합니다.
- va_arg: 가변 인자 포인터에서 특정 자료형 크기만큼 값을 가져옵니다.
- va_end: 가변 인자 처리가 끝났을 때 포인터를 NULL로 초기화합니다.
위에 있는 애들을 사용하면 된다. 예를 들어서 아래 코드를 이용해서 함수의 기능을 이해해보자.
#include <stdio.h>
#include <stdarg.h> // va_list, va_start, va_arg, va_end가 정의된 헤더 파일
void printNumbers(int args, ...) // 가변 인자의 개수를 받음, ...로 가변 인자 설정
{
va_list ap; // 가변 인자 목록 포인터
va_start(ap, args); // 가변 인자 목록 포인터 설정
for (int i = 0; i < args; i++) // 가변 인자 개수만큼 반복
{
int num = va_arg(ap, int); // int 크기만큼 가변 인자 목록 포인터에서 값을 가져옴
// ap를 int 크기만큼 순방향으로 이동
printf("%d ", num); // 가변 인자 값 출력
}
va_end(ap); // 가변 인자 목록 포인터를 NULL로 초기화
printf("\\n"); // 줄바꿈
}
int main()
{
printNumbers(1, 10); // 인수 개수 1개
printNumbers(2, 10, 20); // 인수 개수 2개
printNumbers(3, 10, 20, 30); // 인수 개수 3개
printNumbers(4, 10, 20, 30, 40); // 인수 개수 4개
return 0;
}
va_list와 va_start 사용법
va_list ap; // 가변 인자 목록 포인터
va_start(ap, args); // 가변 인자 목록 포인터 설정
함수로 넘겨진 인자들은 stack에 저장이 된다. va_start(ap, args)를 하면 stack에 담긴 args의 다음 주소인 10을 가르키게 된다.
int ft_printf(const char *format, ...)
va_start(ap, format);
우리가 과제에서의 함수 프로토타입에 대입을 하면, 위 같은 형식으로 사용하면 format 뒤의 인자의 주소부터 ap가 가르키도록 하면 된다.
바이트 패딩이란?
클래스(구조체)에 바이트를 추가해 CPU 접근에 부하를 덜어주는 기법입니다. 어떻게 CPU의 접근 부하를 줄어주는 것일까? 밑의 예제를 보면서 이해해보자.
#include <stdio.h>
typedef struct s_data
{
char c;
int i;
} t_data;
int main()
{
t_data info;
printf("%lu", sizeof(info));
return (0);
}
// 8
위 코드를 실행 시키면 출력 값이 8이 나온다. 구조체에는 char, int가 하나씩 있지만 왜 info의 크기는 8 byte인 것일까? cpu가 연산을 할때 4byte 단위로 연산을 해야 처리속도가 빨라지고 부담이 적어지기 때문에 빈공간으로 메모리를 채워주는 준다.
#include <stdio.h>
typedef struct s_data
{
char c;
long l;
int i;
} t_data;
int main()
{
t_data info;
printf("%lu", sizeof(info));
return (0);
}
// 24
그럼 왜 이건 24 byte가 나온 것일까? 구조체에서 변수는 메모리에서 순서대로 등록이 된다. 메모리를 이미지화 하면
위와 같은 이미지로 구조체가 만들어지게 된다. 그래서 구조체가 24 byte를 가지게 되는 것이다.
바이트 패딩(Byte Padding)
바이트 패딩(Byte Padding) 바이트 패딩(Byte Padding)이란 클래스(구조체)에 바이트를 추가해 CPU 접근에 부하를 덜어주는 기법입니다. 먼저 패딩(Padding) 이라는 말에는 이런뜻이 있습니다.padding1. (푹신
supercoding.tistory.com
'42seoul' 카테고리의 다른 글
[42Seoul] Web Server 프로젝트 회고 (0) | 2024.01.29 |
---|---|
[42Seoul] ft_transcendence 퐁 게임 프로젝트 회고 (1) | 2023.12.17 |
[42Seoul] Net_practice 문제풀이 (0) | 2023.07.13 |
[42Seoul] pipex (0) | 2023.07.02 |
[42Seoul] Born2beroot A-Z (0) | 2023.07.01 |