第14問

三角形の面積を計算して表示するプログラムを作りました。このプログラムには、まれにクラッシュを引き起こす問題が潜んでいます。

何が問題なのか分かりますか?
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));
そうね。だいたいの場合は、このプログラムは期待どおりに動くのよ。
このプログラムが「まれにクラッシュ」する理由を考えてみましょう。