先のプログラムを以下のように書けると思うかもしれません。しかし、これは間違っています。
何故だかわかりますか。pstrcat()関数が返す値は、この関数内で宣言された局所的変数head[ ]のアドレスとなっています。局所的変数head[ ]のメモリ領域はpstrcat()関数の処理が終了すると、他の目的として利用して良いメモリ領域として解放されてしまいます。そのため、指していた先は意味のない領域となります。これをdangling pointer問題と呼んでいます。ポインタの値を返す時には必ず動的に領域を割り当て、そのアドレスを返さなければいけません。 4-2節で説明したとおり、malloc関数で割り当てられた領域は、free関数で明示的に解放されるまで生きています。
#include <stdio.h> char *pstrcat(char *str1, char *str2){ char *ptr; char head[100]; ptr = head; while (*str1 != '\0') *(ptr++) = *(str1++); while (*str2 != '\0') *(ptr++) = *(str2++); *ptr = '\0'; return head; } int main(void){ char str1[100], str2[100]; scanf ("%s", str1); scanf ("%s", str2); printf ("%s\n", pstrcat(str1, str2)); }