[C言語] メモリのヒープの使用

ヒープセグメントに割り当てるには、malloc関数を使用する

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char *char_ptr;
    int *int_ptr;
    int mem_size;

    if(argc < 2)
        mem_size = 50;
    else
        mem_size = atoi(argv[1]);

    printf("\t[+]ヒープから%dバイトを割り当て、先頭アドレスをchar_ptrに代入します。\n", mem_size);
    char_ptr = (char *) malloc(mem_size);

    if(char_ptr == NULL){
        fprintf(stderr, "エラー:ヒープメモリの割り当てに失敗しました。\n");
        exit(-1);
    }

    strcpy(char_ptr, "KOREHA HEAP NI COPY SAREMASU");
    printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);

    printf("\t[+]ヒープから12バイトを割り当て、先頭アドレスをint_ptrに代入します。\n");
    int_ptr = (int *) malloc(12);

    if(int_ptr == NULL){
        fprintf(stderr, "エラー:ヒープメモリの割り当てに失敗しました。\n");
        exit(-1);
    }

    *int_ptr = 31337;
    printf("int_ptr (%p) --> '%d'\n", int_ptr, *int_ptr);

    printf("\t[-]char_ptrが指しているヒープメモリを解放します。\n");
    free(char_ptr);

    printf("\t[+]ヒープから再び15バイトを割り当て、先頭アドレスをchar_ptrに代入します。\n");
    char_ptr = (char *)malloc(15);

    if(char_ptr == NULL) {
        fprintf(stderr, "エラー:ヒープメモリの割り当てに失敗しました。\n");
        exit(-1);
    }

    strcpy(char_ptr, "NEW MEMORY");
    printf("char_ptr(%p) --> '%s'\n", char_ptr, char_ptr);

    printf("\t[-]int_ptrのヒープメモリを解放します。\n");
    free(int_ptr);

    printf("\t[-]char_ptrが指しているヒープメモリを解放します。\n");
    free(char_ptr);

    return 0;
}

$ ./a.out
[+]ヒープから50バイトを割り当て、先頭アドレスをchar_ptrに代入します。
char_ptr (0xaaaac973c6b0) –> ‘KOREHA HEAP NI COPY SAREMASU’
[+]ヒープから12バイトを割り当て、先頭アドレスをint_ptrに代入します。
int_ptr (0xaaaac973c6f0) –> ‘31337’
[-]char_ptrが指しているヒープメモリを解放します。
[+]ヒープから再び15バイトを割り当て、先頭アドレスをchar_ptrに代入します。
char_ptr(0xaaaac973c710) –> ‘NEW MEMORY’
[-]int_ptrのヒープメモリを解放します。
[-]char_ptrが指しているヒープメモリを解放します。

割り当ての値を変えてテストを行う

$ ./a.out 100
[+]ヒープから100バイトを割り当て、先頭アドレスをchar_ptrに代入します。
char_ptr (0xaaaafbe3c6b0) –> ‘KOREHA HEAP NI COPY SAREMASU’
[+]ヒープから12バイトを割り当て、先頭アドレスをint_ptrに代入します。
int_ptr (0xaaaafbe3c720) –> ‘31337’
[-]char_ptrが指しているヒープメモリを解放します。
[+]ヒープから再び15バイトを割り当て、先頭アドレスをchar_ptrに代入します。
char_ptr(0xaaaafbe3c740) –> ‘NEW MEMORY’
[-]int_ptrのヒープメモリを解放します。
[-]char_ptrが指しているヒープメモリを解放します。

### エラー判定を関数化してしまう

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *errorchecked_malloc(unsigned int); 

int main(int argc, char *argv[]) {
    char *char_ptr;
    int *int_ptr;
    int mem_size;

    if(argc < 2)
        mem_size = 50;
    else
        mem_size = atoi(argv[1]);

    printf("\t[+]ヒープから%dバイトを割り当て、先頭アドレスをchar_ptrに代入します。\n", mem_size);
    char_ptr = (char *) errorchecked_malloc(mem_size);

    strcpy(char_ptr, "KOREHA HEAP NI COPY SAREMASU");
    printf("char_ptr (%p) --> '%s'\n", char_ptr, char_ptr);

    printf("\t[+]ヒープから12バイトを割り当て、先頭アドレスをint_ptrに代入します。\n");
    int_ptr = (int *) errorchecked_malloc(12);

    *int_ptr = 31337;
    printf("int_ptr (%p) --> '%d'\n", int_ptr, *int_ptr);

    printf("\t[-]char_ptrが指しているヒープメモリを解放します。\n");
    free(char_ptr);

    printf("\t[+]ヒープから再び15バイトを割り当て、先頭アドレスをchar_ptrに代入します。\n");
    char_ptr = (char *) errorchecked_malloc(15);

    strcpy(char_ptr, "NEW MEMORY");
    printf("char_ptr(%p) --> '%s'\n", char_ptr, char_ptr);

    printf("\t[-]int_ptrのヒープメモリを解放します。\n");
    free(int_ptr);

    printf("\t[-]char_ptrが指しているヒープメモリを解放します。\n");
    free(char_ptr);

    return 0;
}

void *errorchecked_malloc(unsigned int size){
    void *ptr;
    ptr = malloc(size);
    if(ptr == NULL) {
        fprintf(stderr, "エラー: ヒープメモリの割り当てに失敗しました。\n");
        exit(-1);
    }
    return ptr;
}