일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- ioctl
- BOF
- wrefresh
- mvwin
- iptables
- NAPT
- C언어
- level trigger
- .net core 7
- 취약점
- 어셈블리어
- 풀이
- REDIS
- Docker
- architecture
- rfc5508
- epoll
- LOB
- Compiler
- edge trigger
- cbpf
- packet flow
- vtable
- DOCKER-USER
- .nret core 배포
- packet filter
- wnourefresh
- ncurses
- doupdate
- epoll_wait
- Today
- Total
목록C language (26)
Tuuna Computer Science
우리는 C 언어에서 가장 어려운 부분을 포인터라고 지목합니다. 그 이유는 메모리를 하드웨어적으로 접근해서 직접 다루기 때문입니다. (C++이나 Java의 경우 메모리를 어떻게 관리하는지는 제가 배우지 않아 넘기고.) 그래서 C 언어가 High-Level언어 임에도 이 때문에 Low-level처럼 보일 수도 있습니다. 하지만 포인터의 개념을 잡은 상태에서 왜 우리가 포인터를 사용해야함을 이해한다면 더 이상 포인터는 단지 관리하기 편한 하나의 변수이지 않을까 생각합니다. 일단 포인터를 왜 써야함을 설명하지 전에 메모리에 대해서 조금 알아보자 메모리는 고정된 크기를 가지는 연속된 숫자를 가지는 저장공간의 연속이다. 예를 들어 256개가 있는 번호가 매겨진 우편함이라고 생각하면 쉬울 수 있다. 하지만, 우편함에..
주로 배열을 이용해 만든 RPG게임입니다. 실행 방법은 이동키 wasd와 공격키 i,o가 존재합니다. 소스코드도 첨부해 드렸으니 원하는 사람은 수정해서 사용하세용
c 로 작성된 코드다. str를 포인터형으로 선언하여 문자열 " this_is_pointer"를 가리키게 하고 buffer를 배열로 선언하여 hello world를 선언했다. 이렇게 완성된 코드를 올리디버거로 디버깅 과정에서 포인터형으로 선언한 곳에서는 OFFSET 00404000처럼 메모리 덤프 주소를 가리키는것을 볼 수 있당. 그리고 배열로 선언한 부분에서는 값을 직접 메모리에 넣는 것을 볼 수 있다. 즉, 배열은 그냥 주소가 아닌 문자열 데이터가 들어간다. 그리고 LEA eax, [esp+1c]로 값들이 저장된 스택의 주소를 따온다. 의문점 : printf함수를 호출하는 부분에서 OFFSET 004011를 확인할 수 있다. 그럼 printf안에 들어있는 문자열들을 포인터형이라고 말할 수 있는가? A..
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112#include /*바둑판은 배열로 세팅해서 막대가 있는곳은 1로 한다.시작점을 두고 바둑판과 0(가로), 1(세로)에따라 바뀐다.가로와 세로를 조건문으로 두자 ! 배열은 0부터하므로 값을 설정해서 0부터 받게하자 */int w, h;int badook[100][100]; //배열만 선언, 입력받아서in..
인자전달의 기본방식은 값의 복사이다! 함수호출 시 전달되는 값은 매개변수에 복사가 된다. 가장 중요한건 '값의 복사'라는 것이다. 즉, 전달되는 인자와 매개변수는 별개다! int simple(int num) { } int main(void) { int age=17; simple(age); } 이 코드를 보았을 때 age와 num은 단지 값을 주고받을 뿐 더 이상의 관계가 아니라는 것이다. age = num이 절대 아니라는 것이다. 그냥 값만 전달 할 뿐... '복사'... 하지만 age = num이 아니라 했으니 age를 넘기는 것은 어떻게 하는 걸까 이는 포인터를 사용해야 한다. 즉 age하는 변수의 주소에 직접 접근해야 하기에 int simple(int* num) { } int main(void) {..
12345678910111213141516171819202122232425262728#include void clearna(void){ while(getchar()!='\n'); // \n이 나올때 까지 읽어들인다 } int main(void){ char perid[7]; char name[10]; fputs("주민번호 앞 6자리 입력: ", stdout); fgets(perid, sizeof(perid), stdin); //fgets함수는 \n을 만날 때 까지 읽어들이는 함수이다. clearna(); //입력버퍼 지우기! /*getchar(); = 이것도 가능 *//*배열의 크기가 7이므로 6자리 입력 + NULL \n이 밀려 버퍼에 남아 있기 때문에 이것만 읽고 넘어가 버리기 때문에 반복문을 통해 이..
#include //getchar fgetc putchar fputc puts fputs gets fgets //입력받은 문자가 소문자이면 대문자로 대문자이면 소문자로 변환시켜주는 프로그램 int converse(int ch) { int diff='a'-'A'; /* 대문자와 소문자의 차이값은 32이다. */ if(ch>='A' && ch='a' && ch
/* 데이터 기반의 입출력- > 실행프로그램과 하드디스크에 저장되어 있는 파일과의 연결을 위한 스트림의 형성을 우리가 직접 운영체제에게 요구! 프로그램 중심으로 프로그램 안으로 데이터가 흘러 들어오는 것이 입력 플로그램 밖으로 데이터가 흘러 낙는 것이 출력이다. 출력을 담당하는 모니터와 입력을 담당하는 키보드 사이에 어떠한 경로를 가지고 도와주는 다라의 역할을 '스트림'이라 한다!(매개체) 입출력 스트림; 운영체제는 외부장치와 프로그램과의 데이터 송수신의 도구가 되는 스트림을 제공한다! 스트림의 생성과 소멸 (콘솔)(모니터와 키보드)와 파일 입출력 사이에는 차이점이 하나 있다. 파일과의 연결은 스트림의 생성을 우리가 하지만 콘솔과의 연결을 위한 스트림의 생성은 요구 하지않는다. --------------..
#include int main(void) { int arr[10] = {1,2,3,4,5,6,7,8,9, 10}; //배열 선언 int *p = arr; //7행이나 8행이나 같다! arr이나 arr[0]이나! int* p0 = &arr[0]; //이 7줄과 8줄이 의미하는 봐는 arr과 arr[0]의 주소값은 같다. printf("%d\n", arr[0+1]); //arr[1] printf("%d\n", *(arr+1)); //arr주소값에 int형 크기 반큼 바이트가 증가하여 다음 arr[1]의 주소값을 가르킨다. printf("%d\n", *(p0+1)); //int형이니 4byte씩 넘긴다. printf("%d\n", *(p+1)); //4개다 같은것을 가리킨다! printf("%d\n", *p..