三角形の面積を計算して表示するプログラムを作りました。このプログラムには、まれにクラッシュを引き起こす問題が潜んでいます。
何が問題なのか分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
typedef struct {
double base;
double height;
} Triangle;
double TriangleArea(const Triangle *triangle) {
return triangle->base * triangle->height / 2.0;
}
int main(void) {
Triangle *triangle = malloc(sizeof(Triangle));
triangle->base = 6.0;
triangle->height = 4.0;
printf("area = %f\n", TriangleArea(triangle));
free(triangle);
triangle = 0;
return EXIT_SUCCESS;
}
期待される実行結果
area = 12.000000
この問題は、パッと見ただけで解ける人もいるんじゃないかしら。
ホントですか?
えっと、この構造体が三角形を表してて……
typedef struct {
double base; /* 底辺の長さ */
double height; /* 高さ */
} Triangle;
この関数で面積を求められるのか。
double TriangleArea(const Triangle *triangle) {
return triangle->base * triangle->height / 2.0;
/* 「底辺の長さ」×「高さ」÷ 2 */
}
で、ここで底辺が6で高さが4の場合の面積を表示してる!
triangle->base = 6.0;
triangle->height = 4.0;
printf("area = %f\n", TriangleArea(triangle));
そうね。だいたいの場合は、このプログラムは期待どおりに動くのよ。
このプログラムが「まれにクラッシュ」する理由を考えてみましょう。