(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
