0

2つの文字列を交換するコードを作成しました。

void swap (char *a, char *b)
{
    char *t = a;
    a = b;
    b = t;
}

int main()
{
    char * strings[2];
    strings [0] = "luck!";
    strings [1] = "good ";
    swap (strings[0], strings[1]);
    printf( "%s %s\n",strings[0], strings[1]);
    return 0;
}

そしてそれは失敗します。私が理解するのに苦労しているのは、私が呼び出すときにswap()2つのポインターを渡すことです。両方のポインタは、割り当てられた配列の最初の文字を指します。次に、関数内に一時ポインターを作成し、基本的な切り替えを実行しました。ここで何が欠陥ですか?このアプローチが間違っている理由を本当に理解したいですか?

4

4 に答える 4

7

関数スコープに対してローカルである関数のパラメーターを切り替えています。関数が実行されると、パラメーター(char *型のa、およびchar *型のb)が値で渡され、スタックに置かれ、関数が実行されます。パラメータが変更された後、効果なしにスタックからポップされます。

違いを生むには、パラメータへの参照を渡す必要があります。

void swap (char **a, char **b)
{
    char *t = *a;
    *a = *b;
    *b = t;
}

次に、次のように呼び出します。

swap (&strings[0], &strings[1]);

stringsここで、メインのスタックセグメントにある、の個々の配列要素へのポインタを渡します。これにより、のコンテキストを超えて存続しますswap

于 2013-01-30T13:46:25.123 に答える
0

例を挙げると、他にどのような答えが示唆されているかについて...

swap関数をに更新します

void swap (char **a, char **b)
{
    char *t = *a;
    *a = *b;
    *b = t;
}

そしてそれをメインで次のように呼びます

swap(&strings[0], &strings[1]);

ただし、文字列の割り当てを「運!」のような文字列として更新することをお勧めします。は定数であり、個々の文字を更新することはできません。

strings [0] = strdup("luck!");
strings [1] = strdup("good ");
于 2013-01-30T13:52:26.767 に答える
0

関数へのポインターにコピーを渡し、コピーを交換します。実際にそれらを交換するにはC、ポインタをポインタに渡す必要があります。

于 2013-01-30T13:46:31.240 に答える
0

ポインタを介して値を交換する場合は、フォームの割り当てを使用する必要があります

*a = *b;

コードでこれを行うと、文字列の最初の文字が入れ替わります。ポインタを交換するには、タイプのパラメータが必要でありchar**、を渡す必要があります&strings[0]

于 2013-01-30T13:49:17.430 に答える