본문 바로가기

컴퓨터/언어,프로그래밍

C언어 :: 동적할당 : malloc calloc realloc free 1. malloc - malloc함수의 리턴값은 요구한 메모리를 얻으면 메모리의 시작주소를 리턴해주고 얻지 못하는 경우에는 NULL을 리턴해 준다. NULL은 주소값이 없다는 것을 뜻한다. char *p; p=(char *)malloc(10 * sizeof(char)); 2. malloc과 calloc의 차이 - malloc함수는 요구한 메모리를 초기화 하지 않는 반면에 calloc함수는 요구한 메모리의 값을 0으로 초기화 해준다 char *pmem; pmem = (char *)calloc(10,sizeof(int)); 3. realloc realloc함수는 할당 받은 메모리의 크기를 변경하기 위한 함수이다. 재할당 받는 함수이다. 메모리의 크기를 크게하던 작게하던 상관은 없다. 다만 재 할당을 받아도 .. 더보기
C언어 :: #define에 관한 이야기(#, ##, \) #define에 관한 이야기(#, ##, \) 매크로를 만들 때만 사용할 수 있는 지시어가 있는데, 바로 ##과 \이다. ##은 함수와 같은 매크로에서만 사용하는 것으로 두가지 인수를 연결시켜 버리는 기능을 한다. 예를 들어 #define MACRO(a, b) a##b 이렇게 매크로를 만들었다고 하자. 프로그램에서 이 매크로를 a = MACRO(First, Last); 이렇게 사용했다면 실제로는 두 인수 First와 Last가 연결되어 a = FirstLast; 이렇게 되는 것이다. \는 매크로의 내용이 너무 길 때 여러줄에 쓰기 위해 필요한 것이다. 줄 맨 끝에 \를 붙여 주면 그 아래 줄에 계속 연결하여 쓸 수 있게 된다. 예를 들어 #define MACRO(a, b, c) a = b + c; pri.. 더보기
C언어 :: 전처리문의 종류(#include, #define, #ifdef, ... ) 전처리문의 종류(#include, #define, #ifdef, ... ) 전처리문이란? 실질적인 컴파일 이전에 미리 처리되는 문장을 가리킨다. 선행처리기라고도 한다. 따라서 컴파일러는 사용자가 작성한 코드를 컴파일하기 전에 전처리문에서 정의해 놓은 작업들을 먼저 수행한다. 종류로는 #define, #if, #ifdef, #ifndef, #defined, #undef 등이 있다. 이것은 기존에 있는 방대한 소스 코드를 지우지 않고 활성화 비활성화 하는 데에 가장 많이 이용된다. 즉, 기존에 있는 소스 코드를 건드리지 않는 상태에서 부분적인 컴파일을 하는 것이다. C의 전처리문이 오는 줄(Line)의 첫 문자는 항상 '#'으로 시작한다. ANSI 표준에 따른 C의 전처리문의 종류가 아래에 나와 있다. - .. 더보기
[초강추!ㅋㅋ] 구조체 리턴에 관하여 안녕하세요. 구조체를 리턴할 때 어떻게 사용하는게 메모리 효율과 데이터값을 보전하면서 사용해야하는지 모르겠습니다. 기존방법 구조체 인스턴스 변수를 extern으로 선언하여. 함수 호출 시 그대로 데이터 값과 구조체를 사용하여 리턴한다.(리터할필요도 없을듯) ->문제는 extern으로 사용하기때문에 구조체크기가 커질경우 메모리를 아무래도 많이 차지하고, 함수호출시 구조체가 복사되어 느려진다는 단점이 있습니다. ==> extern 키워드를 뭔가 잘못 이해하고 계신게 아닌가 싶습니다. 전역변수를 얘기하신 것 같은데.. extern 키워드는 A라는 파일에 선언된 전역변수를 B라는 파일에서 사용하고 싶을 때 이 변수는 B 파일 외부에 정의된 변수라는 의미로 사용되는 것입니다. 두번째 방법 구조체 주소값을 함수호출.. 더보기
malloc() 작동 원리 http://blackrain.egloos.com/1224982 글 본문에 대한 내 생각을 밝히는 것이 아니기 때문에 트랙백은 남기지 않았다. 다만 글 쓰신 Gony님이 인용하신 '조엘 온 소프트웨어'의 대목에 많은 오류가 있어서 이렇게 글을 적어본다. 물론 좁은 지면과 독자의 배경 지식을 감안해서 쉽고 간단하게 malloc() 동작 원리를 썼으리라 생각한다. 그러나 실제 방식은 이와 많이 다르다. 혹시나 오해를 가질까 해서 이 글을 쓴다. malloc이 어떻게 동작하는지 아십니까? malloc의 본질은 사용 가능한 메모리 블록을 연결 리스트linked list로 길게 연결한 자유 체인(free chain)입니다. malloc은 연결리스트를 따라가며, 요청 받은 메모리 양보다 큰 블록을 찾습니다. 이렇게.. 더보기
[C/C++] malloc, calloc, realloc를 이용한 메모리 할당 malloc와 calloc의 함수 원형은 다음과 같다. void *malloc(size_t size); void *calloc(size_t num, size_t size); malloc는 할당할 메모리 크기를 바이트 단위로 전달받고, 할당된 공간의 값들은 바꾸지 않는다. calloc는 메모리 크기를 두 값으로 나누어 전달받으며, 할당된 공간의 값을 모두 0으로 바꾼다. 그래서 배열을 할당하고 모두 0으로 초기화해야 할 때는 calloc를 쓰면 편하다. 아래 세 문장은 int형 변수를 배열처럼 5개씩 할당하는 예이다. n = (int *)malloc( 5 * sizeof(int) ); n = (int *)calloc( 5, sizeof(int) ); n = (int *)calloc( 1, 5*sizeof(.. 더보기
C언어 :: realloc함수 realloc 동적으로 할당된 메모리를 재할당합니다. Declaration void *realloc( void *memblock, size_t size ) Return value 성공 - 새로운 메모리 영역을 가리키는 포인터 반환 실패 - NULL 포인터 반환 Parameters memblock - NULL 포인터 또는 이전에 할당한 메모리 영역을 가리키는 포인터 size - 새로 할당받을 메모리 크기(단위는 바이트) Detail descriptions realloc()를 번역할 때 "재할당" 또는 "다시 할당"이라고 하는데 많이 어색합니다. 다시 할당하는 것이 아니라 할당된 메모리 영역의 크기를 변경, 대부분은 확장하는 것입니다. 정확하게 이름을 짓는다면 extendalloc()정도가 좋겠습니다. 굳이.. 더보기
[C언어] 배열 - 선언,사용,다차원배열 프로그래밍을 하기 위해서는 먼저 해당 프로그래밍에서 관리해야 할 데이터에 대한 분석과 구현해야 할 기능에 대한 조사가 이루어져야 합니다. 특히 관리해야 할 데이터에 대한 분석을 통해 사용할 타입을 정의를 하고 관리해야 할 자료구조를 선택하게 됩니다. C언어에서는 사용자 정의타입을 정의할 수 있도록 구조체, 공용체, 열거형등의 문법을 제공하고 있으며 자료를 유효 적절하게 관리할 수 있도록 동적 메모리 할당이나 배열과 포인터에 관련된 문법 및 라이브러리를 제공하고 있습니다. 이번 장에서는 동적 메모리 할당을 제외한 나머지 사항에 대해 학습하기로 합시다. 동적 메모리 할당에 대한 내용은 기본적인 문법 사항을 다루고 나서 설명하기로 하겠습니다. 1. 배열 프로그래밍에서 배열이란 동일한 레코드를 연속적인 메모리에.. 더보기