// 자료형 배열이름[요소개수];
int a[5];
[]
안에 넣은 식.int
형, 배열 a 자체의 자료형은 int[5]
형int a[5] = { 1, 2, 3, 4, 5 };
int b[] = { 1, 2, 3, 4, 5, 6 }; // 요소 개수는 6으로 초기화
sizeof(a) / sizeof(a[0]);
sizeof(a)
: 전체 배열이 할당된 메모리의 크기sizeof(a[0])
: 각 요소가 할당된 메모리 크기프로그램 실행하는 도중 원하는 시점에 메모리를 확보하기 위해 힙 영역에 기억 장소를 확보
calloc | malloc | |
---|---|---|
헤더 | #include <stdlib.h> | ➡ |
형식 | void *calloc(size_t nmemb, size_t size); | void *malloc(size_t size); |
예시 | ex) int *x = (int*)calloc(1, sizeof(int)); | ex) free(x) |
해설 | 크기가 size인 자료가 nmemb개만큼 들어갈 메모리를 할당합니다. 할당한 메모리 영역은 모든 비트가 0으로 초기화 됩니다. | 크기가 size인 메모리를 할당합니다. 할당한 메모리의 값은 정의되지 않습니다. |
반환값 | 메모리 할당에 성공하면 할당한 영역의 첫 번째 포인터를 반환. 실패하면 NULL 포인터를 반환. | 메모리 할당에 성공하면 할당한 영역의 첫 번째 포인터를 반환. 실패하면 NULL 포인터를 반환. |
프로그램을 실행하는 도중 원하는 시점에 확보된 메모리 해제
free() | |
---|---|
헤더 | #include <stdlib.h> |
형식 | void free(void *ptr); |
해설 | ptr이 가르키는 메모리를 해제하여 이후에 다시 할당할 수 있도록 함. ptr이 NULL포인터인 경우 아무것도 하지 않습니다. 이 때 ptr로 전달된 실인수(actual argument)가 calloc, malloc, realloc 함수에 의해 반환된 포인터가 아니거나 영역이 free 함수, realloc 함수를 호출하여 이미 해제된 영역이라면 아무것도 하지 않습니다. |
반환값 | 없음 |
#include <iostream>
#include <stdlib.h>
using namespace std;
int main(){
int *x = (int*)calloc(1, sizeof(int)); // 메모리 동적 할당
if(x == NULL) cout << "메모리 할당 실패";
else {
*x = 57;
cout << "*x = " << *x << "\n";
free(x); // 메모리 해제
}
}
new와 delete
new | delete | |
---|---|---|
헤더 | #include <iostream> | ➡ |
형식 | void* operator new ( std::size_t count ); | void operator delete ( void* ptr ) noexcept; |
예시 | ex) int *point = new int[5]; | ex) delete[] point; // 배열 형태 메모리 할당해제 |
해설 | 크기가 size인 자료가 nmemb개만큼 들어갈 메모리를 할당합니다. 할당한 메모리 영역은 모든 비트가 0으로 초기화 됩니다. | 크기가 size인 메모리를 할당합니다. 할당한 메모리의 값은 정의되지 않습니다. |
반환값 | 메모리 할당에 성공하면 할당한 영역의 첫 번째 포인터를 반환. 실패하면 NULL 포인터를 반환. | 없음 |
#include <iostream>
using namespace std;
int main(){
int *x = new int; // 메모리 동적 할당
if(x == NULL) cout << "메모리 할당 실패";
else {
*x = 57;
cout << "*x = " << *x << "\n";
delete x; // 메모리 해제
}
}
<stdio.h>
파일에 매크로로 정의되어있고, 값이 없음을 의미한다#define NULL((void *)0)
프로그램을 실행하면 운영체제는 프로그램이 사용할 메모리 영역을 할당
데이터
전역변수와 정적(static) 변수가 할당되는 영역.
프로그램을 시작하면 할당하고, 프로글매을 종료하면 메모리에서 해제함
스택
함수 호출시 생성되는 지역 변수와 매개변수가 저장되는 영역
함수 호출이 완료되면 사라짐
힙
필요에 따라 동적으로 메모리를 할당
힙 영역은 할당해야할 메모리의 영역의 크기를 run-time에 결정해야하는 경우에 사용.
힙 영역은 관리가 가능한 데이터 외에 다른 형태의 데이터를 관리하기 위한 빈 공간(free space)
즉, 동적 할당을 통해 생성된 동적 변수(dynamic variables)를 관리하기 위한 영역.
힙 영역은 다른 영역(데이터 스택 등)을 모두 할당하고 남은 공간
남은 공간이라고 해서 영역에 제한이 있는 것은 아니고, 시스템의 메모리 영역의 여유 공간에 따라서 달라짐.
Java나 C++ 등에서 new를 사용했던 것처럼 C에서는 malloc, calloc 함수 등을 사용해 동적으로 생성하는 변수를 저장하기 위해 할당하는 영역.
데이터 영역과 스택 영역은 컴파일러가 미리 공간을 예측하고 할당할 수 있지만, 동적 변수는 어느 시점에 얼마만큼의 공간을 할당할지 정확하게 예측할 수 없으므로 run-time에 결정.
구조체: 임의의 자료형을 조합하여 다시 만든 자료구조.
구조체의 선언
/*---구조체 xyz---*/
struct xyz {
int x; // int형 멤버
long y; // long형 멤버
double z; // double형 멤버
};
/*---struct xyz형 a형의 정의---*/
struct xyz a;
/*---a를 가리키는 포인터---*/
struct xyz *p = &a;
멤버 접근연산자 (.) ex) a.x
구조체 객체에 대한 포인터로 멤버 접근하는 형식 (->) ex) p->x
struct xyz 대신 XYZ로 쓰려고 할 때:
typedef struct xyz XYZ;
XYZ a;
XYZ *p = &a;