2005年10月02日

C/C++バグ予防: ポインタを返す関数で気をつけること

過去に以下のような関数を見たことがある。

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

char* func1(int val)
{
  char strtmp[16];

  sprintf(strtmp, "%d", val * 2);

  return (char*)&strtmp;
}

void main()
{
  printf("result=%s", func1(10));
}


これはローカル変数 strtmp のスコープが外れて不定値を返してしまうバグの例である。
結果、画面には「result=data」と表示されない場合が多い。
(実行環境やメモリ配置などの状況によっては「result=data」と表示されることも考えられる。)

改善方法としては、以下のように strtmp を引数で渡す方法が考えられる。

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

void func1(int val, char* strtmp)
{
  sprintf(strtmp, "%d", val * 2);
}

void main()
{
  char strtmp[16];
  func1(10, strtmp);
  printf("result=%s", strtmp);
}


また、strtmpを外に出してグローバル変数にしたり、static変数として宣言する方法もあるが、これはまた新たなバグの危険性が潜んでいる。

たとえば、次のようなケースである。

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

char* func1(int val)
{
  static char strtmp[16];

  sprintf(strtmp, "%d", val * 2);

  return (char*)&strtmp;
}

void main()
{
  printf("result=%s,%s", func1(10), func1(20));
}


実行結果として「result=20,40」を期待するのだが「result=20,20」となってしまう。


・・・そんなわけでポインタで値を返す関数を作成する場合は注意が必要だ。


・・・もしよかったら、右上の広告をクリックしてほしいな・・・。
・・・もしくは、人気blogランキング をクリックしてほしいな・・・。
 m(_ _)m
 
posted by かねやん at 00:01| Comment(1) | TrackBack(1) | C/C++言語 | このブログの読者になる | 更新情報をチェックする
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/7556799

この記事へのトラックバック

interracial fisting anal punishment bdsm palace
Excerpt: Hi
Weblog: latina free young black pussy 09/12
Tracked: 2005-12-09 10:01