汎用的なC言語Swap関数をサポート


C++はCに対して大きな向上があることはよく知られています.つまり、同じ関数が多くの異なるオブジェクトタイプに適用されることです.では、C言語でもこのような操作が可能で、具体的にどのように実現されているのか、Swap関数を例にどのように実現されているのかを説明します.
まず一般的なSwap関数を見てみましょう.
void Swap(int* ap, int* bp)
{
    int temp = *ap;
    *ap = *bp;
    *bp = temp;
}
この関数の2つのパラメータがintを指すポインタである場合、この関数は2つのint型オブジェクト、すなわちメモリで4バイトのレイアウトを2つ交換するしかなく、doubleやshortなどの任意のサイズのレイアウトを交換するには、関数を再実現しなければならない.次に、任意のレイアウトサイズのメモリブロックの交換をサポートできる別のSwap関数の実装について説明する.
void Swap(void* vp1, void* vp2, int size)
{
    void* p = (void*)malloc(size);
    assert(p != NULL);
    
    memcpy(p, vp1, size);
    memcpy(vp1, vp2, size);
    memcpy(vp2, p, size);

    free(p);
}
皆さん、この関数のパラメータが特定のオブジェクトを指すポインタではなく、voidオブジェクトを指すポインタであることを見てください.vp 1とvp 2が指す内容を交換するのですが、その関数はその内容の具体的な大きさを知りません.私たちはこの2つのメモリブロックのアドレスしか伝わっていないので、3番目のパラメータsizeを追加しました.このパラメータは、交換するメモリブロックのサイズを示します.これにより、実装中に空間を動的に申請し、メモリコピー関数memcpyを呼び出すだけでよいが、free申請の空間を忘れないでください.
次に、汎用Swap関数を呼び出す方法を示します.
    double c = 2.2;
    double d = 3.3;
    Swap(&c, &d, sizeof(double));

このように呼び出すと,cとdの値が入れ替わる.プラットフォーム間でサポートするために、異なるプラットフォームまたはマシンの下でdoubleが8バイトであるとは限らないため、3番目の実パラメータを転送する際にsizeof関数を使用します.
この関数は、2つの長さの異なる2つのオブジェクトをサポートしていません.特定の場合でも正しく交換できますが、これも特殊な場合です.
後で、この方法で汎用的なC言語スタックをどのように実現するかを書きます.