次のプログラムは、文字列の一部をコピーして次々に表示するものです。正常にコンパイルされ、実行すると期待通りの表示になりました。でも、問題点があります。

何が問題なのか分かりますか?
main.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void) {
char text[] = "Hello!";
char *pPartOfText = 0;
for (int i=0; i<strlen(text); i++) {
pPartOfText = malloc(sizeof(text));
if (pPartOfText) {
strncpy(pPartOfText, text + i, sizeof(text));
printf("%d: %s\n", i, pPartOfText);
}
}
if (pPartOfText) {
free(pPartOfText);
pPartOfText = 0;
}
return EXIT_SUCCESS;
}
実行結果
0: Hello!
1: ello!
2: llo!
3: lo!
4: o!
5: !

ふむふむ、
malloc()
でメモリーを確保して、strncpy()
で文字列の一部をコピーしてるんですね。

で、その動作を
for
ループで繰り返したあと……

仕上げに
free()
でメモリーを解放してますね!

malloc()
とfree()
が呼び出される回数を数えてみましょう。