2005-04 / 2005-04-23

前のエントリ: zshを使ってコマンドを指定回数連続実行 [shell]
次のエントリ: wanderlust フォルダの別名のキーバインド [wanderlust]

malloc, realloc 基本
2005-04-23-1 / カテゴリ: [c][programming] / [permlink]

メモリを確保する
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)
前のエントリ: zshを使ってコマンドを指定回数連続実行 [shell]
次のエントリ: wanderlust フォルダの別名のキーバインド [wanderlust]

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