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