C言語:動的メモリ割り当て例


このレッスンでは、ダイナミックメモリ割り当てを使用して名前を入力および出力する例を示します.
動的割り当てとは、お尻の領域を指します.
ダイナミックメモリを使用して受信名と出力名を割り当てる例を見てみましょう.

<コード>

#include <stdio.h>
#include <malloc.h>


int main()
{
    char* p_temp;
    p_temp = (char*)malloc(40);//40바이트를 동적할당한다.
    if (p_temp != NULL)
    {
        printf("너의 이름을 입력해 > \n");
        gets(p_temp);
        printf("~%s이야.\n", p_temp);
        free(p_temp); //free를 통해서 동적 할당을 해제했다.

    }
    else {
    
        printf("제대로 된 값을 입력해!!!!");
    }

}

<結果>



<重要コード1>

 if (p_temp != NULL)
    {
        printf("너의 이름을 입력해 > \n");
        gets(p_temp);
        printf("~%s이야.\n", p_temp);
        free(p_temp); //free를 통해서 동적 할당을 해제했다.

    }
  • if文により,ポインタp tempが正しく割り当てられているかどうか異常処理を行った.正しく割り当てられていない場合、else文が実行されます.
  • は確かに筆者自身がメモリ入力を割り当てるフォーマットなので、コンパイル時間が長い.メモリを適切な場所に割り当てる練習をたくさんしなければなりません.
  • 次の例では、静的メモリ割り当てを使用して受信し、数値を計算します.

    <コード>

    #include <stdio.h>
    #define MAX_COUNT 5
    int main()
    {
        int arr[MAX_COUNT], count = 0, sum = 0; 
        while (count < MAX_COUNT)
        {
            printf("숫자를 입력하세요 : (8888를 누르면 자동종료)");
            scanf_s("%d", arr + count); // 즉 count만큼 값을 입력하고 저장하겠다는 의미다.
            if (count == 8888)
                break; // 만약에 사용자가 8888를 입력했으면 break를 통해서 빠져나온다.
            count++;
        }
        for (int i = 0; i < count; i++) //여기서는 값을 누적하고 더하는 부분을 뜻한다.
        {
            if (i > 0) printf("+"); 
            // 맨 마지막 콘솔창에 나오는 더하기 부분을 표시하기 위해 조건을 i > 0 무조건 실행 될 수 밖에 없는 조건을 걸었다.
            printf("%d", arr[i]); // 입력 받은 값들을 전부 다 출력한다.
            sum = sum + arr[i]; //sum 값에 arr[i] 값을 더해 sum에 저장한다.
        }
        printf(" == %d\n", sum);
    
    
    }
    <結果>

    <重要コード1>

        while (count < MAX_COUNT)
        {
            printf("숫자를 입력하세요 : (8888를 누르면 자동종료)");
            scanf_s("%d", arr + count); // 즉 count만큼 값을 입력하고 저장하겠다는 의미다.
            if (count == 8888)
                break; // 만약에 사용자가 8888를 입력했으면 break를 통해서 빠져나온다.
            count++;
        }
  • scanf s("%d",arr+count)の意味はscanf+s("%d",&arr[count])と同じです.
  • if文で例外処理を記述した.
  • <重要コード2>

    for (int i = 0; i < count; i++) /
        {
            if (i > 0) printf("+"); 
       
            printf("%d", arr[i]); 
            sum = sum + arr[i]; //sum 값에 arr[i] 값을 더해 sum에 저장한다.
        }
        printf(" == %d\n", sum);
    
  • ここでは累計と値上げの部分を指す.
  • 」の最後のコンソールウィンドウのプラス記号部分を表示するには、条件をi>0で実行する必要がある条件に設定します.
  • for文によりarr[i]値を配列を迂回して出力する.
  • 動的メモリをさらに拡張して割り当て、数値を入力して要約する例を見てみましょう.

    <コード>

    #include <stdio.h>
    #include <malloc.h>
    
    int main()
    {
    
        int* p_num_list, limit = 0, count = 0, sum = 0, i;
        printf("입력할 개수를 입력하세요 : ");
        scanf_s("%d", &limit); // 사용자로부터 값을 입력 받는다. 
        p_num_list = (int*)malloc(sizeof(int) * limit); // 사용자로부터 입력 받은 값을 동적 할당으로 사용한다.
        while (count < limit)
        {
            printf("숫자를 입력하세요 : (8888를 누르면 종료한다. : ");
            scanf_s("%d", p_num_list + count); // 이 의미는 &p_num_list[count]와 동일하다.
            if (*(p_num_list + count) == 8888) break; 
            //만약에 포인터(대상이 가리키고 있는 값이 8888) == (사용자가 입력하는 값이 8888이라면) 빠져나와라. 
            count++;
        }
        for (int i = 0; i < count; i++)
        {
            if (i > 0) printf("+");
            printf("%d", *(p_num_list + i)); //앞에선 p_num_list를 arr[i]로 표현했다. 둘이 같은 표현이다. *(arr+i) 로도 표현가능하다.
            sum = sum + *(p_num_list + i);
        }
        printf(" = %d\n", sum);
        free(p_num_list);
    }

    <結果>


  • の前の例とあまり差はありませんが、表現の違いがあります.
  • arr[i]=*(arr+i)は同じ意味です.
  • で最後に動的割り当てを解除することを忘れないでください.