본문 바로가기
지난 학기들의 기록/C 기초

[C실습] 동적할당예제 - 2차원 배열 활용

by 아메리카노와떡볶이 2020. 8. 21.
728x90
동적메모리 할당예제 - 2차원 배열

2차원 배열에 메모리를 할당하기 위해서는 이중포인터를 활용해야합니다.

1차원 배열의 메모리 할당과는 다르게 두가지 스텝으로 분류해서 이 과정을 이해할수 있습니다.

 

먼저 2차원 배열의 행과 열을 row (행), column(열)로 두었을때 선행되는 작업은 row 행만큼 정수형 포인터의 메모리를 할당하는 것입니다. 

d_Array= malloc(sizeof(int *) * row) // 1차원 배열을 row개 만큼 메모리 할당한다고 이해할수 있습니다.

 

 

그리고 할당된 row개의 메모리 공간에 가로길이 col 만큼(열에 해당) 메모리를 할당해줍니다.

이 각각은 1차원 배열이므로 기존에 알고있던 배열의 메모리할당을 떠올리면 쉽습니다.

 

for(int i=0;i<N;i++){

d_Array[i]=malloc(sizeof(int) * col)

}

 

위와 같은 방법으로 2차원배열에 메모리를 할당할수있습니다.

예제풀이 1, 2

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>    // malloc, free 함수가 선언된 헤더 파일
/* 문제4번 2차원배열에 동적할당하기 */
int main()
{
    int row, col; //row ->행 , column -> 열
    scanf("%d %d"&col, &row);
    char ** d_Array;
    char n = 'a'-1;
    //이중 포인터에 int 포인터 크기*row 만큼 동적 메모리할당
    d_Array = malloc(sizeof(char** row);
 
    for (int i = 0; i < row; i++) {
        d_Array[i] = malloc(sizeof(char* col);
    }
 
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++) {
                n++;
                d_Array[i][j] = n;
                printf("%c ", d_Array[i][j]);
                if (n == 'z') {
                    n = 'A' - 1;
                }
                else if (n == 'Z') n = 'a' - 1;
        }
        printf("\n");
    }
    for (int i = 0; i < row; i++) {
        free(d_Array[i]);
    }
    free(d_Array);
    return 0;
}
cs

 

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int N;
    int min_length=0;
    int min_idx=0;
    scanf("%d"&N);
    getchar();
    char** d_array;
    d_array = malloc(sizeof(char** N);
    for (int i = 0; i < N; i++) {
        d_array[i] = malloc(sizeof(char)*100);
    }
    for (int i = 0; i < N; i++) {
        gets(d_array[i]);
    }
    min_length = strlen(d_array[0]);
    for(int i=1;i<N;i++){
    if(min_length>strlen(d_array[i])){
        min_length = strlen(d_array[i]);
        min_idx = i;
    }
    }
    printf("%s", d_array[min_idx]);
    for (int i = 0; i < N; i++) {
        free(d_array[i]);
    }
    free(d_array);
    return 0;
}
cs

 

 

++심화, 문자열의 길이가 긴 순서대로 정렬하여 출력하기

#pragma warning(disable:4996)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    int N;
    int min_length = 0;
    int min_idx = 0;
    char* temp;
    scanf("%d", &N);
    getchar();
    char** d_array;
    d_array = malloc(sizeof(char*) * N);
    for (int i = 0; i < N; i++) {
        d_array[i] = malloc(sizeof(char) * 100);
    }
    for (int i = 0; i < N; i++) {
        gets(d_array[i]);
    }

    min_length = strlen(d_array[0]);
    for (int i = 0; i < N; i++) {

        for (int j = 0; j < N - i - 1; j++) {

            if (strlen(d_array[j]) < strlen(d_array[j + 1])) {
                temp = d_array[j];
                d_array[j] = d_array[j + 1];
                d_array[j + 1] = temp;
                
            }

        }

    }
    
    for (int i = 0; i < N; i++) {
        printf("%s", d_array[i]);
        printf("\n");
    }
    for (int i = 0; i < N; i++) {
        free(d_array[i]);
    }
    free(d_array);
    return 0;
}

728x90

댓글