(2005-04の一覧)
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
2005-04-23 Sat (他の年の同じ日: 2004 2006)
malloc, realloc 基本
2005-04-23-1 / カテゴリ: [c][programming] / [permlink]
メモリを確保する
malloc
「プログラムが」使用出来るメモリ領域を確保する。
realloc
プログラムが使用出来る既存のメモリ領域を拡大する。既存のメモリ領域から連続した領域が空いていればそこが、空いていなければ、別の位置に領域確保&既存の位置のデータのコピーが行われる。多分
malloc
「プログラムが」使用出来るメモリ領域を確保する。
#include <stdio.h> #include <stdlib.h> int main() { char *str; char *str2 = "hogefoobar"; str = (char *)malloc(strlen(str2) + 1); /* str2の文字列長+1('\0'用)を確保し str にそのアドレスを保持 */ if (str == NULL) { /* malloc の例外処理 */ perror("cannot malloc\n"); return -1; } strcpy(str, str2); /* 文字列のコピー */ printf("str: [%s] %p\n", str, str); printf("str2: [%s] %p\n", str2, str2); free(str); /* メモリの開放 */ return 0; }malloc 前にどこかのアドレスをさしていた場合は、その内容はなくなる…のかな
realloc
プログラムが使用出来る既存のメモリ領域を拡大する。既存のメモリ領域から連続した領域が空いていればそこが、空いていなければ、別の位置に領域確保&既存の位置のデータのコピーが行われる。多分
#include <stdio.h> #include <stdlib.h> int main() { char *str; char *str2 = "foobar"; str = (char *)malloc(strlen(str2) + 1); /* まずは str に領域確保 */ if (str == NULL) { perror("cannot malloc\n"); return -1; } strcpy(str, str2); printf("str: [%s] %p (size: %d)\n", str, str, strlen(str)); str = (char *)realloc(str, strlen(str) + strlen(str2) + 1); /* str に更に str2 分を追加 */ if (str == NULL) { perror("cannot realloc\n"); return -1; } strcat(str, str2); /* str = str + str2 */ printf("str: [%s] %p (size: %d)\n", str, str, strlen(str)); free(str); return 0; }↑ realloc しないとコアダンプした(cygwin/gcc)
2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12
最終更新時間: 2013-05-02 16:12