[C言語]ポインタを返す関数を実装してみたが何かもやもやする件

猫でもわかるC言語第11章の1より
#include <stdio.h>
#include <string.h>

char *mystrcat(char *, char *);

int main()
{
    char a[32] = "hello,";
    char b[] = " world!";

    printf("%s\n", mystrcat(a, b));
    return 0;
}

char *mystrcat(char *x, char *y)
{
    char *ret = x + strlen(x);

    while( (*ret++ = *y++) ) {
        ;
    }

    return x;
}
実行結果
hello, world!
書いてみてわかったのですが、このコードにはちょっとインチキがあります。
実は関数mystrcatが変数aに副作用を及ぼします。
一見2つの文字列を結合して新たな文字列を作成しているようでありながら、実は変数aを加工しているにすぎないのです。

その証拠に、下記の2行のコードはどちらも同じ結果を出力します。
printf("%s\n", mystrcat(a, b)); // => hello, world!
printf("%s\n",a);               // => hello, world!
つまりmystrcatがポインタを返す必要性は全然ない。

普段PHPを書いている身としてはこういう関数の仕様にはすごい違和感あるのですが、C言語ではこういうのが普通なのでしょうか・・・?

あ~もやもやする~
カテゴリ:

人気記事