0

こんにちは、strcat() によってポインターがどのように返されるかを理解しようとしているので、独自の strcat() を実装して、それがどのように機能するかを確認してみました。以下は、実際の strcat() のように機能する mystrcat() の私のコードです。

char *mystrcat(char *destination, char *source)
{
    char *str = destination;

    while (*str != '\0')
    {
        str++;
    }

    while (*source != '\0')
    {
        *str = *source;
        str++;
        source++;
    }
    *str = '\0';

    return str;
}

だから私のmain()で言ってみましょう、私は持っています

char string[BUFSIZ];
mystrcat(string, "hello");
printf("%s\n", string);

出力は次のようになります

hello

予想通り。私が得られないのは、ローカル変数 str のアドレスを返すと、魔法のように変数文字列がそれを指すようになる方法と、関数が終了したときに変数 str が削除されない理由です。

4

3 に答える 3

1

ローカル変数のアドレスを返していません。ローカル変数のを返しています。問題の変数はポインターであるため、その値はたまたまアドレスになります。変数に含まれるアドレスはstr、引数によって提供されるメモリ ブロックを指しますdestination

あなたが誤解しているように見えるのは、次のことです。

char* str = destination;

文字列のコピーを作成しませんdestinationstrが指すのと同じメモリ位置を指す と呼ばれるポインタを作成しますdestination。を使用strしてそのメモリ ブロック内の文字を操作すると、 で表される文字列destinationも変更されます。これは、 と がメモリ内のまったく同じ文字列をstr指しdestinationているためです。これが、パラメーターを「魔法のように更新」する方法です。

于 2010-09-30T18:22:46.157 に答える
0

strstring渡す文字列 (宛先) へのポインターであるため、関数内から元の変数を変更していますstrcat

ポインターstrはルーチンの最後に削除されますが、もう必要ありません。

stringところで、多くの言語ではキーワードとして予約されているため、「文字列」という単語を変数の名前として使用するのは混乱を招きます。

于 2010-09-30T18:24:37.667 に答える
0

関数の最初の行では、*str を *destination と同じに割り当てています。実際には、戻るときは、*str と同じ *destination を返しています。

メモリは割り当てられないため、メモリを削除する必要はありません。

于 2010-09-30T18:24:59.740 に答える