malloc - free → new - delete , 그리고

cin<<size; //할당할 배열의 크기
int* arr=(int*)malloc(sizeof(int)*size);
arr의 포인터를 선언해서 재미보고
free(arr);
풀어준다.

왜 이따위로 복잡하게 만들었는지... 외웠는데 기억도 잘 안난다.
그냥 쓸때마다 찾아봐야지

int i, j
arr[i][j];로 쓸 수 있게 해놓음 편하잖아
컴파일러에서 자동으로 매크로처럼 돌려주면 좋을 것 같은데..

c++ 에서는 조금 더 편해졌다.

int * val = new int;
//포인터까지는 동일한데 new int로 쉽게 메모리를 할당한다.
int형태로 하니까 sizeof도 필요없고..

int * arr = new int[size];
// size는 배열의 사이즈.. 앞에서 입력받는다. cin<<size;
구조체 선언
typedef struct Person
{
 name[100];
 num[100];
} Person;

Person * arr= new Person[size];
//구조체도 가능..하겠지?

반환방법도 간단
delete val;
delete []arr;
delete []Person;

new연산자 메모리 할당 성공 실패 체크

new는 메모리 연산을 실패할 경우 NULL포인터를 리턴한다.
if(arr==NULL)
{
  cout<<"메모리 할당 실패"<<endl;
  return -1; //프로그램 종료
}

프로그램에 if가 들어가서 시스템 효율만 떨어뜨린다.

그래서...p88
#define DEBUG 1 //테스트시 1로...
//#define DEBUG 0  //최종 버전 컴파일시 0으로..

#if DEBUG==1
  cout<<"디버그 모드 "<<endl;
  if(arr==NULL)
  {
    cout<<"메모리 할당 실패"<<endl;
    return -1;
  }
#endif

#if, #endif는 컴파일 단계에서 DEBUG가 1이면 저걸 컴파일 하라는 전처리 명령 1이 아니면 컴파일 하지 않고 넘어간다.

C언어의 메모리 구조, 동적할당 malloc, callloc

프로그램이 실행되려면 메모리 공간이 필요하다.
운영체제는 프로그램을 실행시킬 때 메모리 공간을 할당 해 준다.

메모리 공간 : 스텍 Stack, 힙 heap, 데이터 data 영역

DATA 데이터 영역 - 전역변수, static변수 // 프로그램이 시작될 때 할당되어 종료될 때 까지 유지
heap 힙 영역 - 프로그래머가 할당 // ***메모리 동적 할당에서 활용되는 영역
stack 스텍 영역 - 지역변수, 매개변수 // 함수 호출이 완료되면 할당 영역이 사라진다

배열은 상수로 선언되어야 하는 이유 577p
스텍되 데이터 영역에 할당될 메모리 크기는 컴파일타임(compile-time)에 결정되야하기 때문에
누구나 한번씩 생각 해 보는 배열의 선언인...

int arr[i]
scanf("%d", &i);

이런 형태의 선언은 에러가 발생한다.

malloc 함수 & free 함수 메모리 동적 할당-----------------------581p

malloc
동적으로 메모리를 할당하는 함수--heap영역에 메모리를 할당

#include <stdlib.h>
void* malloc(size_t size)
성공시 할당된 메모리의 첫번째 주소 리턴, 실패 시 NULL포인터 리턴

사용 방법

#include
#include

void function(int);
int main(void)
{
int m=0;
fputs("배열의 크기를 입력하세요: ", stdout);
scanf("%d", &m);
function(m);

return 0;
}

void function(int i)
{
//int array[i]; //ProbArray.c에서의 문제점
int* array = (int*)malloc(sizeof(int)*i);
int j;
if(array==NULL)
{
puts("메모리 할당에 실패!");
exit(1); //비 정상적 종료를 의미함
}
/*동적 할당한 메모리 사용*/
for(j=0;j
array[j]=j+1;
for(j=0;j
printf(""%d", array[j]);
printf("\n");

free(array); // 할당된 메모리 소멸
}


calloc

#include <stdlib.h>
void *calloc(size_t elt_count, size_t elt_size)
성공 시 할당받은 메모리의 포인터(void*형), 실패 시 NULL 리턴


malloc 과 사용방법은 거의 동일하다.

int *arr = (int*)calloc(size,sizeof(int));
==
int *arr = (int*)malloc(size*sizeof(int));