1

*destこのカスタム文字列コピー関数があり、逆参照して内容を変更すると引数が変化することに気付きました。

char *copyArray(char *dest, char *src)
{
    char *a = dest;

    while (*dest++ = *src++)
        ;   
    char *b = dest;

    if ( (a-b) != 0)  
        printf("Dest pointer has changed\n");

    return dest;                                                                        
}

そして、次のコードを検討すると:

int main()
{
    char name [] = "Hello, there!";

    char *new = copyArray(name, "bye");

    printf("New is '%s', name is '%s'\n", new, name); 

    return 0;
}

次の出力が得られます。

Dest pointer has changed
New is 'o, there!', name is 'bye'

なぜこれが起こるのですか?

私の意図は*new、同じ場所をname[]指すことでしたが、明らかにアドレスが変更されたため、別の場所を指しています。

何が起こったのか、コピーが終了すると、Cは宛先文字列の元の内容から変更された文字数(「さようなら」の場合は4)を引いたものを新しいアドレスに移動し、それをに割り当てたように感じ*destます。

これは本当に起こっていることですか?そして、誰かが私に理由を説明してもらえますか?

これは実際には仕事とは関係ありません。ポインターの動作をよりよく理解しようとしているだけです。

返信ありがとうございます。

4

2 に答える 2

4

引数は(条件で)関数内で4回(条件dest内で)インクリメントされ(最後の反復で割り当てられるnullを含む4文字) 、その値が返されるため、を指します。while"bye"whilecopyArray()newname + 4

からの復帰の始まりをnew指すこと。nameacopyArray()

于 2012-10-17T12:57:48.573 に答える