개요
// 정적 구조체 배열 생성예.
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);
연관
첫 등록 : 2019년 12월 28일
최종 수정 :
단축 주소 : https://igotit.tistory.com/2435
'VisualStudio.C++.C# > C . C++' 카테고리의 다른 글
C, C++. 상수 2진수 , 16진수 (0) | 2020.01.03 |
---|---|
C/C++. 메모리 스택, 힙,지역변수, 동적 메모리 할당. stack, heap, new, delete (0) | 2019.12.28 |
C/C++. #error. 컴파일시 사용자 지정 오류 메시지 출력 하고 컴파일 종료 (0) | 2019.10.22 |
C/C++. #define. #, ## 등 (0) | 2019.10.22 |
C/C++. const int * , int const *, int * const, int * const const (0) | 2019.10.21 |
댓글