アルファベット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)
が間違っている理由を考えてみましょう。