1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C言語の基礎 (ポインタ) NO.5 備忘録

Posted at

メモリ確保関連の処理を行うには、stdlib.hをincludeして、その中に宣言されている関数を利用する。

malloc:メモリを確保
free :確保したメモリが不要になった時に解放

#malloc関数とは
由来: memory allocation(割り当てる)
メモリを確保するには、引数に確保したいメモリのサイズ(バイト数)を指定して呼びだす。
うまくいくと、確保されたメモリの先頭アドレス(ポインタ)が戻り値として返してくれる。
失敗すると、NULLが戻り値になる。

戻り値がNULLでなければ、戻り値のポインタのアドレスから指定したサイズ分のメモリを自由に利用できる。
戻り値の型「void *」
ポインタ = malloc(サイズ)

#void *とは
C/C++のポインター変数は、例えばchar *ならchar型変数を指すポインターであり、int *ならint型変数を指すポインターである。
対してvoid *は、void型変数というものは存在していない特殊なもので、ポインターではあるがその型は__指定されていない。__

void *型のポインターは、代入はできるが参照ができず、参照しようとすればコンパイル時点でエラーとなる。
この型で受け取ったものを参照するときには別途char *型などに型キャストせねばならない。

#free関数
malloc関数で不要になったメモリを解放して新たな確保で再度利用できるようにしなければならない。
書式: void free(void *ptr)

malloc関数とfree関数は必ずペアで処理する。

test.cpp
  int *piData = NULL;   // 確保したメモリエリアのポインタを格納する変数の宣言
  
  CCLOG("*piDataの値:%p",piData); // 定義直後のポインタの値を表示
  
  piData = (int*)malloc(sizeof(int)); // int型のサイズ分メモリを確保 c++なのでキャストする必要がある
  
  if ( piData == NULL )
  {
    return -1;  // 確保に失敗したので何もせずにおわる
  }
  
  CCLOG("piDataの値:%p",piData);  // 確保直後のポインタの値表示
  
  *piData = 500;  // 確保したエリアに500を代入 *が付いているのでポインタが示す変数になる
  
  CCLOG("piDataポインタの中身:%d",*piData);
  
  free(piData); // メモリエリアの解放

実行決定
cocos2d: *piDataの値:0x0
cocos2d: piDataの値:0x17400e330
cocos2d: piDataポインタの中身:500

#他のメモリ確保の関数

calloc関数
ポインタ = calloc(データ個数,データ1つのサイズ);

(int*)malloc(sizeof(int))
(int*)calloc(1,sizeof(int))

この2つは等しい。

realloc関数
新しいエリアのポインタ = realloc(最初のエリアのポインタ、新たなサイズ);
確保するメモリのサイズを変更できる。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?