組み込み技術を向上したい!!

でも組み込み以外にも手を出し始めました・・・

free() で失敗!! C言語

callocとかmallocとかで、メモリを確保して使用した後は解放するために、
free()を使うことになるんだけど、
ここで、残念なミスをおかしていたので、メモしとく。

free()の引数はきちんと制御してないとダメ!!

今回やらかした過ちはfree()の引数が割り当てられていないにも関わらず
free()しようとしてしまうルートをつくってしまったという内容だった…

free()ってそんなに万能じゃないのね…
処理系によるのかな? 今回はARM cortex M4でやらかしました。。。

ちなみにcallocとかは stdlinb.hに入ってて、ヒープメモリから任意のメモリサイズを割り当てることかできます。

たぶん、普通は↓みたいな感じ

#include <stdio.h>
#include <stdlib.h>

int8_t test_func(uint8_t val)
{
  uint8_t *p;

  /* 256個のuint8_tサイズのメモリを確保 */
  p = (int *)calloc(256,sizeof(int));
   
  /* 何らかの事情でメモリ確保できなかったとき */
  if(NULL == p) {
    return (-1);
  }

  /*-----------------------*/
  /* ここで p を好きに使う */
  /*-----------------------*/

  /* メモリの開放 */
  free(p);

  return 0;
}

でも↓みたいになると

#include <stdio.h>
#include <stdlib.h>

int8_t test_func(uint8_t val)
{
  uint8_t *p;

  if ( 1 == val ) {
    printf("ちゃんと勉強しなさい\n");
  }
  else {
    /* 256個のuint8_tサイズのメモリを確保 */
    p = (int *)calloc(256,sizeof(int));
   
    /* 何らかの事情でメモリ確保できなかったとき */
    if(NULL == p) {
      return (-1);
    }

    /*-----------------------*/
    /* ここで p を好きに使う */
    /*-----------------------*/
  }
  /* メモリの開放 */
  free(p);

  return 0;
}

test_func(1)でコールしたときに残念な結果になってしまいますね。。。

Good Luck to オレ!!