😺 주의!
지역 변수가 할당된 저장 공간은 자동으로 초기화되지 않으므로 쓰레기 값이 사용되지 않도록 조심하기.
사용 범위가 명확하고 통제 가능한 지역 변수를 우선적으로 사용하고, 많은 함수에서 수시로 데이터를 공유하는 경우에만 제한적으로 전역 변수를 사용하는 것이 좋다.
어라 이친구는 왜 있는거지...?
아무튼 문자열 분리 코드! ⬇️
#include <stdio.h>
int main(void) {
char str[80];
printf("문자열을 입력하세요: ");
fgets(str, sizeof(str), stdin);
char *sp, *tp;
sp = str;
while (*sp != '\0') {
tp = sp;
while ((*tp != '\0') && (*tp != ' '))
tp++;
if (*tp != '\0') {
*tp = '\0';
tp++;
}
if (*sp != '\0') {
printf("%s\n", sp);
}
sp = tp;
}
return 0;
}
#include <stdio.h>
void add_ten(int a);
int main(void)
{
int a = 10;
add_ten(a);
printf("a: %d\n", a);
return 0;
}
void add_ten(int a)
{
a = a + 10;
}
#include <stdio.h>
void add_ten(int *ptr);
int main(void)
{
int a = 10;
add_ten(&a);
printf("a: %d\n", a);
return 0;
}
void add_ten(int *ptr)
{
*ptr = *ptr + 10;
}
#include <stdio.h>
void *sum(int a, int b);
int main(void)
{
int *res_ptr;
res_ptr = sum(10,20);
printf("두 정수의 합: %d\n", *res_ptr);
return 0;
}
void *sum(int a, int b)
{
static int res;
res = a + b;
return (&res);
}
제대로 활용한 적이 없어서 지금은 간단하게 정리
#include <stdio.h>
void *sum(int a, int b);
int main(void)
{
char *ptr_arr[5];
int i;
ptr_arr[0] = "dog";
ptr_arr[1] = "elephant";
ptr_arr[2] = "horse";
ptr_arr[3] = "tiger";
ptr_arr[4] = "lion";
for (i = 0; i < 5; i++)
printf("%s\n", ptr_arr[i]);
return 0;
}
#include <stdio.h>
int main(void)
{
int ary1[4] = {1,2,3,4};
int ary2[4] = {11,12,13,14};
int ary3[4] = {21,22,23,24};
int *pary[3] = {ary1, ary2, ary3};
int i,j;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
printf("%5d", pary[i][j]);
printf("\n");
}
}
#include <stdio.h>
void swap_ptr(char **ppa, char **ppb);
int main(void)
{
char *pa = "success";
char *pb = "failure";
printf("pa -> %s, pb -> %s\n", pa, pb);
swap_ptr(&pa, &pb);
printf("pa -> %s, pb -> %s\n", pa, pb);
return 0;
}
void swap_ptr(char **ppa, char **ppb)
{
char *pt;
pt = *ppa;
*ppa = *ppb;
*ppb = pt;
}
그림 하나 참고 ㅎㅎ
#include <stdio.h>
void print_str(char **pps, int cnt);
int main(void)
{
char *ptr_ary[] = {"eagle", "tiger", "lion", "squirrel"};
int count;
count = sizeof(ptr_ary) / sizeof(ptr_ary[0]);
print_str(ptr_ary, count);
return 0;
}
void print_str(char **pps, int cnt)
{
int i;
for (i = 0; i < cnt; i++)
printf("%s\n", pps[i]);
}
콜백 함수를 구현할 때 자주 사용.
함수 배열: 다양한 함수를 저장
#include <stdio.h>
void add(int a, int b) { printf("Sum: %d\n", a + b); }
void subtract(int a, int b) { printf("Difference: %d\n", a - b); }
int main() {
void (*operation[2])(int, int); // 함수 포인터 배열
operation[0] = add;
operation[1] = subtract;
operation[0](5, 3); // add 함수 호출
operation[1](5, 3); // subtract 함수 호출
return 0;
}
동적 함수 호출: 실행 중에 어떤 함수를 호출할지 결정해야 하는 상황
추상화와 유연성: 특정 조건에 따라 다른 동작을 수행해야 할 때...??
#include <stdio.h>
#include <stdlib.h>
int compare_asc(const void *a, const void *b) {
return (*(int*)a - *(int*)b);
}
int compare_desc(const void *a, const void *b) {
return (*(int*)b - *(int*)a);
}
int main() {
int arr[] = {3, 1, 4, 1, 5, 9};
int n = sizeof(arr) / sizeof(arr[0]);
// 오름차순 정렬
qsort(arr, n, sizeof(int), compare_asc);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
// 내림차순 정렬
qsort(arr, n, sizeof(int), compare_desc);
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
printf("\n");
return 0;
}
#include <stdio.h>
int sum(int, int);
int main(void)
{
int a = 10;
double b = 3.5;
void *vp;
vp = &a;
printf("a : %d\n", *(int *)vp);
vp = &b;
printf("b : %.1lf\n", *(double *)vp);
return 0;
}
도전 실전 예제
#include <stdio.h>
#include <string.h>
void swap(char *type, void *pa, void *pb);
int main(void)
{
int a = 10, b = 20;
double da = 1.5, db = 3.4;
swap("int", &a, &b);
printf("a: %d, b: %d\n", a, b);
swap("double", &da, &db);
printf("da: %.1lf, db: %.1lf\n", da, db);
return 0;
}
void swap(char *type, void *pa, void *pb)
{
int temp;
double dtemp;
if(strcmp(type, "int") == 0)
{
temp = *(int *)pa;
*(int *)pa = *(int *)pb;
*(int *)pb = temp;
}
else if(strcmp(type, "double") == 0)
{
dtemp = *(double *)pa;
*(double *)pa = *(double *)pb;
*(double *)pb = dtemp;
}
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *pi;
double *pd;
pi = (int *)malloc(sizeof(int));
if (pi == NULL)
{
printf("#메모리가 부족합니다. \n");
exit(1);
}
pd = (double *)malloc(sizeof(double));
*pi = 10;
*pd = 3.4;
printf("정수형으로 사용: %d\n", pi);
printf("실수형으로 사용: %.1lf\n", *pd);
free(pi);
free(pd);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *pi;
int i, sum = 0;
pi = (int *)malloc(5*sizeof(int));
if (pi == NULL)
{
printf("메모리가 부족합니다!\n");
exit(1);
}
printf("다섯 명의 나이를 입력하세요 : ");
for (i = 0; i < 5; i++)
{
scanf("%d", &pi[i]);
sum += pi[i];
}
printf("다섯 명의 평균 나이: %.lf\n", (sum / 5.0));
free(pi);
return (0);
}
#include <stdlib.h>
#include <string.h> // memset 함수 사용
void *ft_calloc(size_t num, size_t size)
{
size_t total_size = num * size; // 총 할당할 메모리 크기 계산
void *ptr = malloc(total_size); // 메모리 할당
if (ptr == NULL) // 할당 실패 시 NULL 반환
return NULL;
memset(ptr, 0, total_size); // memset을 사용하여 메모리 0으로 초기화
return ptr; // 초기화된 메모리 반환
}
Valgrind 찾아보고 실행해보기
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
char temp[80];
char *str[3];
int i;
for (i = 0; i<3; i++)
{
printf("문자열을 입력하세요 : ");
gets(temp);
str[i] = (char *)malloc(strlen(temp)+1);
strcpy(str[i], temp);
}
for (i = 0; i < 3; i++)
printf("%s\n", str[i]);
for (i = 0; i < 3; i++)
free(str[i]);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void print_str(char **ps);
int main(void)
{
char temp[80];
char *str[21] = {0};
int i = 0;
while (i < 20)
{
printf("문자열을 입력하세요 : ");
gets(temp);
if (strcmp(temp, "end") == 0) break;
str[i] = (char *)malloc(strlen(temp) +1);
strcpy(str[i], temp);
i++;
}
print_str(str);
for (i = 0; str[i] != NULL; i++)
{
free(str[i]);
}
return 0;
}
void print_str(char **ps)
{
while (*ps != NULL)
{
printf("%s\n", *ps);
ps++;
}
}