| #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




