본문 바로가기

프로그래밍/C언어

[C언어] calloc() 과 realloc() 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. calloc() 과 realloc() 동적메모리를 할당 하는 방법에는 malloc() 외에 calloc()과 realloc()이 있습니다. 먼저 calloc()에 대해서 알아보겠습니다. calloc()은 다음과 같이 정의 되어 있습니다. void *calloc(size_t count, size_t size); calloc()은 두개의 매개 변수를 가지고 있습니다. 두개의 매개 변수는 각각 크기와 개수를 따로 받습니다. 다음은 malloc() 으로 메모리 할당하는 법과 calloc()으로 메모.. 더보기
[C언어] 동적메모리 할당의 해제 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 동적 메모리 할당 해제 우리는 메모리를 동적으로 할당하는 함수가 malloc() 이라고 배웠습니다. 그런데 동적으로 메모리를 할당하고 사용한 뒤에는 반드시 할당한 메모리를 해제 해주어야 합니다. 해제 해주지 않는다면 메모리 누수가 발생할 것입니다. 할당 한 메모리를 해제하는 함수는 free() 함수를 사용 하는 것입니다. 사용하는 방법은 다음과 같습니다. int *p = malloc(sizeof(int)); // 4byte의 메모리 할당free(p); // 4byte의 메모리할당 한것을 해제.. 더보기
[C언어] 동적 메모리 할당 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 동적 메모리 할당 함수 내에 지역적으로 선언된 변수나 배열은 함수가 종료가 되면 메모리에서 사라 집니다. 그렇기 때문에 다른 함수에서 다시 사용할 수 없습니다. 다른 함수에 사용하기 위해 전역적으로 선언하면 되지만 이 방법은 프로그램의 종료까지 메모리 공간을 사용하므로 비효율 적입니다. 이러한 불편함 때문에 필요할 때만 메모리를 할당 받아 사용하고 반납하는 것이 바로 동적 메모리 할당 입니다. 다시 정리 해보자면 동적 메모리 할당이란 프로그램이 실행 중에 원하는 시간에 메모리를 할당 받는 것.. 더보기
[C언어] 포인터(10) - 배열과 매개변수 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 배열과 매개변수 매개변수를 통해 배열을 전달하려고 할 때 매개변수의 타입을 배열로 하면 됩니다. 하지만 이는 성능상 문제가 있습니다. 왜냐하면 배열의 크기가 작으면 상관 없지만 배열의 크기가 클 경우에는 시간이 아주 오래 걸릴 수 있습니다. 그렇기 때문에 매개변수로 배열을 넘겨주는 것 보다 배열의 주소만 넘겨주게 되면 성능적으로 매우 효율적이고 메모리도 많이 절약 할 수 있습니다. 예를 들면 다음과 같이 할 수 있다. 1234567891011121314#include int sumArr(in.. 더보기
[C언어] 포인터(9) - 함수와 포인터(값에 의한 호출, 참조에 의한 호출) 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 함수와 포인터 함수를 호출 할 때 인수의 값이 매개변수로 복사되어 전달이 됩니다. 이것을 값에 의한 호출(call by value)이라고 합니다. 반면 포인터를 매개변수로 선언하면 호출된 함수로 주소를 전달하는 것이 가능하며 이것을 참조에 의한 호출(call by reference)라고 합니다. 그럼 먼저 값에 의한 호출에 대해서 알아보도록 하겠습니다. 1) 값에 의한 호출(call by value) 아래의 코드를 보겠습니다. 1234567891011121314151617181920#incl.. 더보기
[C언어] 포인터(8) - 포인터와 문자열 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 포인터와 문자열 문자열은 타입이 char인 배열입니다. 그렇기 때문에 포인터의 타입 또한 char 형이어야 합니다. char str = "hello"; char* strptr = &str; 예제를 통해서 알아 보겠습니다.12345678910111213141516171819#includeint main(void) { char str[] = "hello"; char *strptr = &str; printf("str = %s\n", str); printf("strptr = %s\n", strptr.. 더보기
[C언어] 포인터(7) -void 포인터와 NULL 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. void 포인터 void포인터는 가리키는 대상이 없는 포인터 입니다. 다음과 같이 void포인터를 선언 합니다. void* ptr; 타입이 void 형이지만 여기서 void의 의미는 타입이 없다는 뜻이 아니라 타입이 정해져 있지 않음을 뜻할 뿐입니다. 그렇기 때문에 void포인터에는 어떤 종류의 포인터값도 형변환 없이 대입이 가능 합니다.예를 들면 다음과 같습니다. 12345678910111213#includeint main(void) { int intP = 1; double doubleP .. 더보기
[C언어] 포인터(6) -[] 연산자 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. [] 연산자 오늘은 [] 연산자에 대해서 알아보겠습니다. []은 어디서 봤을까요 ? 그렇습니다. 배열에서 요소에 접근할 때 [] 연산자를 이용하여 접근을 하였습니다. []연산자는 지정된 주소에서 i만큼 떨어진 곳의 값을 읽어 오는데 사용 할 수 있습니다. 즉 [] 연산자는 다음과 같이 정의 할 수 있습니다. 주소[i] = 주소에서 i만큼 떨어진 곳에 저장된 값을 반환한다. 이 말을 잘 기억해 주세요. 그렇다면 배열이름[i] 라고 이때까지 알고있었는데 배열이름이 주소라는 이야기 일까요 ? 네 .. 더보기
[C언어] 포인터(5) - 포인터의 연산 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 1.포인터(5) 1) 포인터의 연산 포인터에 저장된 값은 부호없는 정수 입니다. 그렇기 때문에 정수 처럼 덧셈 뺄셈 등 증감연산자나 비교연산도 가능합니다. 다음과 같은 코드에서 ptr++의 결과를 알아 보도록 하겠습니다. int *ptr = (int *)0x100; ptr++을 하였으니 0x101될 것이라고 생각할 수 있습니다. 하지만 이것은 잘못된 생각 입니다. ptr은 int 형이기 때문에 0x100 ~ 0x103 까지의 범위를 사용합니다. 그렇기 때문에 ptr++을 했을 경우에는 0x1.. 더보기
[C언어] 포인터(4) - 포인터의 형변환, 상수포인터 안녕하세요 ! 초보개발자 입니다. 이 블로그는 개인 공부 정리용 블로그 입니다. 혹 잘못된 내용이 있다면 지적 부탁드리겠습니다.그리고 질문주신다면 최대한 아는선에서 답변드리도록 하겠습니다.그럼 시작하도록 하겠습니다. 1.포인터(4) 1) 포인터의 형변환 포인터도 앞에 강의에서 말한 것 처럼 변수이기 때문에 형 변환이 가능 합니다. 변수와 같이 자동 형변환과 강제 형변환이 가능 합니다. 예를 들면 다음과 같습니다. 1234567891011#include int main(void) { int i; double *ptr = &i; return 0;} cs int 형 변수의 주소값을 double형으로 자동 형변환이 됩니다. 변수에서 자동 형변환 되던 것과 같습니다. 강제 형변환도 마찬가지 입니다. 위의 예제를 .. 더보기