드디어 200번째 글입니다. void형 포인터에 대해서 배워봅시다. 보통 우리는 다음과 같이 썼을 거에요. 이것은 무엇을 의미할까요? 일단 p에 15를 넣습니다. p는 메모리에 어딘가에 할당이 되어 있을 겁니다. 그리고 이 p의 주솟값을 a가 들고 있습니다. 예를 들어 p의 주소가 0x80이라면 a는 0x80을 들고 있는 것입니다. 다음에 (*a)++이 있는데요. 이는 (*a) = (*a) + 1을 의미합니다. a를 역참조하면 p가 되므로, 결국 p에 1을 증가시키라는 것과 같습니다. 최종적으로는 p = 16이 될 거에요. a는 int형 자료형을 가르켰어요. void형 포인터는 이와 다르게, 주솟값을 저장하고 있기는 한데, 가리키는 자료형을 모르는 pointer를 의미합니다. 아래 예제를 봅시다. int..
코딩/C 검색 결과
동적 할당은 무엇인가요? 예를 들어, 이런 코드가 있다고 해 봅시다. malloc 함수가 호출되기 전에 메모리 상태는 아래와 같습니다. 처음에 Heap 영역에는 아무 것도 할당되지 않았습니다. 그런데 malloc, 메모리 할당 함수가 호출이 되면, 힙 영역에 무언가를 위한 공간이 만들어 집니다. 그러면 이런 상태가 됩니다. 메모리에 할당된 주솟값을 p가 받고 있습니다. 그러면 stack에 있는 변수 p가 Heap 공간에 할당된 space를 가리킵니다. 이것이, 자동으로 해제가 되면 좋겠습니다만. 그렇지 않아요. 명시적으로 해제를 시켜주지 않으면, (동적으로 할당된 공간은) 프로그램이 끝날 때 까지 메모리에서 사라지지 않습니다. free 함수의 원형은 다음과 같습니다. 그냥 해제할 공간의 주소만 넘겨주면 ..
동적 할당을 할 때, 자주 쓰는 함수 중 하나는 malloc입니다. 오늘은 이 함수에 대해서 간단하게 알아보고, 1차원, 2차원 배열을 어떻게 동적 할당하는지 배워보도록 하겠습니다. 할당할 size를 인자로 받고, void형 포인터를 리턴하는데요. malloc가 리턴한 결과값에 적절하게 형변환을 해야 한다는 것을 의미해요. 이것만 보시면, 무슨 이야기인지 잘 모르실 듯 싶어서, 1차원 배열을 dynamic allocate 하는 걸 예로 들어보도록 하겠습니다. 먼저 아래 프로그램을 보겠습니다. 되게 어려운 것 같지만, 사실 5번째 줄이 핵심입니다. 저는 sizeof(int)에 5를 곱한 것 만큼 공간을 할당했는데요. 이는 5개짜리 int형 자료를 저장할 수 있는 space를 할당했다는 의미입니다. 그러면 ..
이번 시간에는 명령행 인자인, argc와 argv를 해 보도록 하겠습니다. 사실, 이것이 무엇인지 생소할 수도 있습니다. 아래 ls 명령어를 봅시다. Linux에서 ls는 디렉토리에 있는 파일들에 대한 정보를 출력해 주는 명령어인데요. ls 명령어를 썼는데, 여기서 -a라는 옵션을 추가로 주었어요. 즉, 실행 파일을 실행할 때 옵션을 추가로 받을 수 있다는 의미입니다. 오늘은 이것들을 가지고 간단하게 놀아보도록 하겠습니다. 먼저, 다음과 같이 실행을 했다고 생각해 봅시다. 초록색으로 칠한 것은 실행 파일 명입니다. work를 실행을 한 것입니다. 그리고 보라색으로 칠한 것은 옵션을 의미하는데요. 보라색의 갯수는 5개임을 알 수 있습니다. argc는, 이 보라색의 갯수 + 1과 같습니다. 실행 파일명, 명..
오늘은 간단하게 문자열 리터럴만 올리도록 하겠습니다. "chogahui", "xi" 이런 것들을 우리는 리터럴이라고 합니다. 그러면, 이것들은 어디에 어떻게 저장이 되길래, 이들을 바꾸려고 하면 RTE가 뜰까요? 예제 프로그램 1을 봅시다. 4번째 줄에 보면 "chogahui" 라는 리터럴이 있습니다. 이것을 p가 가리키고 있어요. 그리고 p[0]에 'x'를 넣습니다. 6번째 줄에 p를 출력하는데요. "xhogahui"라는 내용이 출력될 거 같아요. 그런데, Seg fault가 뜹니다. 어떻게 된 걸까요? 이 상황을 다시 그려봅시다. p가 "chogahui"를 가리키고 있어요. 그러면 p[0]은 "chogahui"의 1번째 요소인 'c'일 겁니다. 이것을 'x'로 바꾸는 연산은, 메모리의 어느 영역에 '..
최근댓글