개요

 

// 정적 구조체 배열 생성예. 

typedef struct _st1
{
  uint8_t ui8Arr[100]; 

}ST_T1

ST_T1 myST_T1[5][9]; // 구조체 ST_T1 을 2차원 배열 5x9 짜리로 생성하는것.  

위와 같은 정적 생성 방식의 구조체 배열 생성하지 않고 동적 생성하는 방법 정리. 

 

1. 구조체 멤버만 동적 생성예. 

2. 구조체 배열만 동적 생성예. 

3. 구조체 멤버 및 배열 모두 동적 생성예. 

 

1. ST_T1 의 멤버 1차원 배열만 동적생성 예.

상기와 같은 정적 방식으로 구조체 2차원 배열로 만든것과 달리, ST_T1 의 1차원 배열 uint8_t ui8Arr[100] 처럼 고정 사이즈 100 이 아닌 동적 임의 사이즈 배열 생성가능한것을 멤버로 가지면서, ST_T1 의 2차원 배열은 정적으로 생성하는 방법. 

 

단계1. 선언 

// 동적 구조체 멤버인것의 구조체 배열 생성예. 

typedef struct _st1
{
  uint8_t * pui8Arr; // 동적 생성할 대상. 

}ST_T1

ST_T1 myST_T1[5][9]; // 구조체 ST_T1 을 2차원 배열 5x9 짜리로 생성하는것.  


 

단계2. 구조체 동적 할당 위한 함수 

-요점 : 아래 함수 recreate 에서 메모리동적생성 총 45(=5x9) 개 만들고 생성된 메모리의 주소를 포인터 변수 pui8Arr 에 대입시켜두는것.  init_myst_t1 은 초기 실행시 pui8Arr 은 NULL 로 명시적으로 초기화 할 의도이나, 선언시 기본 NULL 로 초기화 되므로 필수는 아님. 

void init_myst_t1()
{
    for(int idx_0=0; idx_0 < 5; idx_0++)
    {
        for(int idx_1=0; idx_1 < 9; idx_1++)
        {        
        	myST_T1[idx_0][idx_1].pui8Arr = NULL; //
        }
    }
}


void recreate_myst_t1(uint32_t num_element)
{

    for(int idx_0=0; idx_0 < 5; idx_0++)
    {
    	for(int idx_1=0; idx_1 < 9; idx_1++)
        {        
            if(myST_T1[idx_0][idx_1].pui8Arr != NULL) 
            {
            	free(myST_T1[idx_0][idx_1].pui8Arr); // 이전에 할당한 메모리 삭제. 
            }
            /// 배열사이즈 num_element 만큼 동적생성.
             myST_T1[idx_0][idx_1].pui8Arr =(uint8_t*)malloc(sizeof(uint8_t)*num_element);            
        }
    }
}

 

2. 구조체 2차원 배열만 동적 생성예. 

ST_T1 myST_T1[5][9];  로 정적 크기로 생성한것을  동적 생성하는것. 

 

 

단계1. 선언. 

// 동적 구조체 멤버인것의 구조체 배열 생성예. 

typedef struct _st1
{
  uint8_t ui8Arr[100]; // 정적 배열. 

}ST_T1

ST_T1 ** myppST_T1 = NULL; // 동적 2차원 배열 할당할 변수.  


 

단계2. 구조체 2차원 배열 동적 할당 함수 

//예 구조체 2차원배열 [5][9]  동적 생성하여 대입하기. 
 
myppST_T1 = (ST_T1**)malloc(sizeof(ST_T1*)*5);  // 배열 첫인덱스에 해당하는것 동적생성. 

for(int idx = 0; idx < 5; idx++)
{
    myppST_T1[idx] = (ST_T1*)malloc(sizeof(ST_T1) * 9); //각 배열 첫인덱스별각각별로9개의 ST_T1  
}

// 상기 생성된 메모리블럭 지우기. 
for(int idx=0; idx<5; idx++)
{
    free(myppST_T1[idx]);  
}
free(myppST_T1);

 

 

3. 구조체 배열 및 멤버 모두 동적 생성예. 

- 앞의 방식 을 조합하면됨. 

 

단계1. 선언 

// 동적 구조체 멤버인것의 구조체 배열 생성예. 

typedef struct _st1
{
  uint8_t * pui8Arr; // 동적 메모리 생성하여 할당. 

}ST_T1

ST_T1 ** myppST_T1; // 동적 2차원 배열 생성할 대상. 


 

 

단계 2. 코드 

//예 구조체 2차원배열 [5][9]  동적 생성. 

ST_T1 ** myppST_T1;   

myppST_T1 = (ST_T1**)malloc(sizeof(ST_T1*)*5);  // 배열 첫인덱스에 해당하는것 동적생성. 

for(int idx = 0; idx < 5; idx++)
{
    myppST_T1[idx] = (ST_T1*)malloc(sizeof(ST_T1) * 9); //각 배열 첫인덱스별각각별로9개의 ST_T1  
}

uint8_t idx_0, idx_2; 

    for(int idx_0=0; idx_0 < 5; idx_0++)
    {
    	for(int idx_1=0; idx_1 < 9; idx_1++)
        {        
            if(myppST_T1[idx_0][idx_1].pui8Arr != NULL) 
            {
            	free(myppST_T1[idx_0][idx_1].pui8Arr); // 이전에 할당한 메모리 삭제. 
            }
            /// 배열사이즈 num_element 만큼 동적생성.
            myppST_T1[idx_0][idx_1].pui8Arr =(uint8_t*)malloc(sizeof(uint8_t)*num_element);
            
        }
    }


/////////////////////// 상기 생성된 메모리블럭 지우기. 
    for(int idx_0=0; idx_0 < 5; idx_0++)
    {
    	for(int idx_1=0; idx_1 < 9; idx_1++)
        {        
            if(myppST_T1[idx_0][idx_1].pui8Arr != NULL) 
            {
            	free(myppST_T1[idx_0][idx_1].pui8Arr); // 이전에 할당한 메모리 삭제. 
            }
        }
    }


for(int idx=0; idx<5; idx++)
{
    free(myppST_T1[idx]);  
}
free(myppST_T1);

 

 

 

 

연관 

 

C. malloc , free 메모리 동적 할당. 제거.

헤더파일 : stdlib.h void * malloc (uint32_t byte_size) 반환값 성공시 생성된 주소 포인터 실패시 NULL void free(void * ptr) - malloc 으로 생성된 메모리 영역 제거하는것. 사용예 . - uint8_t 1차원배열 10..

igotit.tistory.com

 

 

C/C++. 메모리 스택, 힙,지역변수, 동적 메모리 할당. stack, heap, new, delete

스택(Stack), 힙(Heap) C/C++ 에서의 스택이니, 힙이니 하는 것들은 C/C++ 컴파일러에서 메모리 핸들링 하는 것에 대한 기능적 메모리 구분 명칭. (타겟 시스템에 하드웨어적으로 스택, 힙 영역의 메모리가 따로..

igotit.tistory.com

 

 

 

 


첫 등록 : 2019년 12월 28일 

최종 수정 : 

단축 주소 : https://igotit.tistory.com/2435

 


 

Posted by 리치굿맨

댓글을 달아 주세요