목록PROGRAMMING::LANGUAGE/C (13)
Love Every Moment
Pythontutor C Tutor - Visualize C code execution to learn C online Write code in C (gcc 9.3, C17 + GNU extensions) C (gcc 4.8, C11) [older but more stable] Someone is typing ... Visualize Execution Live Programming Mode pythontutor.com C언어를 연습하면서 포인터가 실제로 어떻게 작동하는지, 메모리 구조 상에서 어떻게 저장되는지 혼란이 생길 때가 많았다. 그래서 추천 받은 사이트가 파이썬 튜터였는데 아주 많은 도움이 되었다. 마치 디버깅 툴처럼 next 버튼을 누르면 차례대로 코드를 실행한 결과를 보여준다. 이렇게 코드를 ..
동료 카뎃이랑 코드를 가지고 이것저것 실험해보다가 요상한 것을 발견했다. printf("%d", 10) 대신에 printf("%d", '10') 을 입력하니 결과가 10이 아닌 12592 가 나오는 것이었다. 구글링도 하고 스택 오버플로우도 뒤지면서 도출한 결론은 이렇다. 따옴표 ' ' 안에 들어간 10 의 타입은 char 형식으로 인식된다. 1 과 0 은 ascii 코드로 각각 49 와 48 이다. char 의 크기는 1바이트(8비트)이고 int 의 크기는 4바이트(32비트)이다. 따라서 (int)'10' 은 (49 * 8 * 32) + 48 = 12592 가 된다. 물론 애초에 char 형식의 ' ' 안에 한 자리 문자를 넣지 않은 것부터 이상하기 때문에 컴파일을 하면 다음과 같은 경고가 뜬다. ..
1. 형식문자열(FORMAT) int printf(const char* format, ...) 형식문자열, 서식문자열 또는 포맷 이라고 부르며 출력하고자 하는 문자열 을 의미한다. printf() 는 표준출력(stdout)에 일련의 데이터들을 형식문자열(format)에 지정되어 있는 형태로 출력한다. 형식문자열 뒤에 오는 가변인자들의 개수는 형식 문자열 속의 형식 태그(format tag)의 개수와 같다. 2. 서식지정자(Format Specifier) % 문자로 시작하며 대표적으로 %d, %c, %s, %p 등이 있다. 컴퓨터가 어떤 정보를 어떻게 해석할 건지 지정해주는 역할을 한다. 예를 들어 printf("%d\n", 10); 이면 10을 부호 있는 10진수 정수로 해석하여 출력한다. 형식 태그 안..
1. leaks 명령어 (1) 파일 실행 중에 검사하기 main 문 안에 while 문을 사용하는 등의방법을 써서 프로그램이 종료되지 않도록 하고 컴파일 후에 ./a.out 으로 파일을 실행시키고 leaks a.out ※ 해당 방법으로 메모리 누수가 뜨지 않는 경우가 있어서 (2)번 방법을 추천 (2) 프로그램 내부에 leaks 명령어 삽입 main 문 안에 직접 삽입했기 때문에 프로그램이 종료되기 전에 검사 가능 system 명령어를 통해 쉘 명령어를 main 문 안에서도 사용할 수 있다. system("leaks a.out > leaks_result_temp; cat leaks_result_temp | grep leaked && rm -rf leaks_result_temp"); #include #in..
1. 댕글링 포인터란 malloc() 함수를 이용하여 동적 메모리를 할당한 후에는 free() 함수를 통해 할당된 메모리를 해제한다. 하지만 포인터가 여전히 해제된 메모리 영역을 가리키고 있을 때에 문제가 될 수 있다.이것을 댕글링 포인터라고 부른다. 2. 문제점 메모리 접근시 예측 불가능한 동작을 일으킬 수 있다. 메모리 접근 불가 시 Segmentation fault 가 발생한다. 잠재적인 보안 위험이 있을 수 있다. 3. 예제 int *ptr; ptr = (int *)malloc(sizeof(int)); *ptr = 1; printf("%d\n", *ptr); free(ptr); *ptr = 2; 처음에 *ptr 을 1 로 출력하고 나서 메모리를 해제해주었는데 ptr 은 여전히 처음 할당된 메모리 ..
1. 변수의 종류 (1) 지역 변수(Local Variable) 프로그램 내의 변수가 선언된 함수에서만 사용 가능한 변수 함수가 시작할 때에 메모리가 할당되고 함수가 끝날 때에 메모리가 해제됨 스택 영역에 저장되며 함수가 끝나면 자동 삭제됨 따라서 함수 실행이 끝나면 변수에 저장된 값은 사라짐 (2) 전역 변수(Global Variable) 함수 밖에서 선언되어 주어진 프로그램 내의 어느 함수에서나 사용 가능한 변수 프로그램이 시작할 때에 메모리가 할당되고 프로그램이 끝날 때에 메모리가 해제됨 컴파일 시간에 데이터 영역에 메모리를 할당하여 저장되며 프로그램이 끝나면 자동 삭제됨 따라서 프로그램이 끝날 때까지 변수 안의 값이 유지됨 (3) 정적 변수(Static Variable) 지역 변수의 특성과 전역 ..
size_t 는 typedef 를 이용하여 정의한 하나의 별칭(alias)이다. typedef __darwin_size_t size_t; size_t가 정의되어 있는 를 보면 위와 같이 정의되어 있다. 이론상 가장 큰 사이즈를 담을 수 있는 '부호 없는(unsigned) 데이터 타입'으로 생각하면 된다. size_t 형 변수를 printf() 를 이용하여 출력하려면 %ld 또는 %zu 를 이용한다. unsigned int 와의 차이는 운영체제에 따라 사이즈가 변하는지 여부에 있다. size_t 의 경우에는 32비트 운영체제 아래에서 '부호 없는 32비트 정수(unsigned int)', 64비트 운영체제 아래에서 '부호 없는 64비트 정수(unsigned long long)'로써 고정된 사이즈를 가진다...
1. malloc int main(void) { int *x; int *y; x = malloc(sizeof(int)); *x = 42; *y = 13; } 위의 코드는 y 가 어디를 가리키는지 정의하지 않았다는 점에서 오류가 있다. 초기화되지 않은 *y 에 13 이라는 값을 저장하려고 하면 오류가 발생한다.따라서 y 가 가리키는 곳이 어디인지 정의하는 과정이 필요하다. #include #include int main(void) { int *x; int *y; x = malloc(sizeof(int)); y = x; *y = 13; printf("%i\n", *x); printf("%i\n", *y); free(x); } y = x 라는 코드를 더해줌으로써 y 가 가리키는 곳이 x 와 같게 되었다. 따라..