三角形の面積を計算して表示するプログラムを作りました。このプログラムには、まれにクラッシュを引き起こす問題が潜んでいます。
![](/wp-content/include/images/avatar/teacher/5.png)
何が問題なのか分かりますか?
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
![](/wp-content/include/images/avatar/teacher/4.png)
この問題は、パッと見ただけで解ける人もいるんじゃないかしら。
![](/wp-content/include/images/avatar/student/11.png)
ホントですか?
![](/wp-content/include/images/avatar/student/7.png)
えっと、この構造体が三角形を表してて……
typedef struct {
double base; /* 底辺の長さ */
double height; /* 高さ */
} Triangle;
![](/wp-content/include/images/avatar/student/2.png)
この関数で面積を求められるのか。
double TriangleArea(const Triangle *triangle) {
return triangle->base * triangle->height / 2.0;
/* 「底辺の長さ」×「高さ」÷ 2 */
}
![](/wp-content/include/images/avatar/student/3.png)
で、ここで底辺が6で高さが4の場合の面積を表示してる!
triangle->base = 6.0;
triangle->height = 4.0;
printf("area = %f\n", TriangleArea(triangle));
![](/wp-content/include/images/avatar/teacher/4.png)
そうね。だいたいの場合は、このプログラムは期待どおりに動くのよ。
![](/wp-content/include/images/avatar/teacher/7.png)
このプログラムが「まれにクラッシュ」する理由を考えてみましょう。