ヒープセグメントに割り当てるには、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; }