第18問

アルファベット1文字と、それがABC順で何番目なのかを構造体に格納するプログラムを作りました。でも、このプログラムには重大な誤りがあります。

どこが間違っているのか分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <ctype.h>

typedef struct {
  uint8_t letter; /* 文字 */
  uint32_t order; /* ABC順で何番目か */
} AlphabetInfo;

AlphabetInfo *mallocAlphabetInfo(uint8_t letter) {
  const char *pAll = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  const char *pFound = strchr(pAll, toupper(letter)); /* toupper() で大文字にしてから検索 */
  if (pFound) { /* strchr() は見つけた文字のアドレスを返す */
    AlphabetInfo *info = malloc(5);
    if (info) {
      info->letter = letter;
      info->order = 1 + (uint32_t)(pFound - pAll); /* Aが「1番目」なので1を足す */

      return info;
    }
  }

  return 0;
}

int main(void) {
  AlphabetInfo *info = mallocAlphabetInfo('x');
  if (info) {
    printf("'%c' is the %dth letter.\n", info->letter, info->order);

    free(info);
    info = 0;
  }

  return EXIT_SUCCESS;
}
期待される実行結果
'x' is the 24th letter.
これは、アレですか?場合によってクラッシュする系の……
そうそう。クラッシュしないプログラムに直す問題よ。
やっぱり!ちょっと怪しいなと思った箇所があるんですよ。
いいわね!どこらへんが怪しいのかしら?
はい。えっと……プログラム中にあるmallocAlphabetInfo()っていうのが、構造体を作る関数だと思うんですけど。
そうね。「受け取った文字がアルファベットだったら、メモリー上に構造体を作って返す」という動作になってるわね。
ですよね!その中にあるmalloc(5)のところが、なんだか怪しい気がするんですよ……
それじゃあ、そのへんを考えてみましょうか。
はーい!
malloc(5)が間違っている理由を考えてみましょう。