1

だから私は基本的にタイプ t の 2 つの引数を交換する SWAP(t,x,y) マクロを作成しようとしています。これら2つの引数が次の形式の場合、問題を回避することを考えようとしています

v[i++] と w[f(x)] 、つまり SWAP(int, v[i++], w[f(x)])。

以下のコードは基本的にクラッシュしています...

#define SWAP(T,x,y) {T *p = x; T *q = y; T z = *p; *p = *q; *q = z;}

int f (int x){
    return (0-x);
}

int main(void) {

int v[] = {1,2,3};
int i = 0;

int w[] = {4,5,6};
int x = -1;

int *p = v;
int *q = w;

SWAP(int*, v[i++],w[f(x)]);

return 0;
}

何がうまくいかないのでしょうか?

4

3 に答える 3

5
SWAP(int*, v[i++],w[f(x)]);

v[i++]要素ですが、int次のポインターオブジェクトに割り当てています:

T *p = x;

したがって、セグメンテーション違反pT z = *p;発生するのはいつですか。要素へのポインターが必要な場合は、&演算子を使用します。

さらにv[i++]、 には副作用があり ( を変更i++します)、マクロ呼び出しで副作用のある式を渡してはいけません。

于 2013-05-04T18:21:15.573 に答える
3
#define SWAP(T,x,y) {T *p = &(x); T *q = &(y); T z = *p; *p = *q; *q = z;}
...
    SWAP(int, v[i++], w[f(x)]);
于 2013-05-04T18:41:40.160 に答える
0

SWAPこのソリューションは、引数を 1 回だけインスタンス化し、識別子として再利用してシャドウすることで、副作用を回避します。

#define SWAP(type, a_, b_) \
do { \
    struct { type *a; type *b; type t; } SWAP; \
    SWAP.a  = &(a_); \
    SWAP.b  = &(b_); \
    SWAP.t  = *SWAP.a; \
    *SWAP.a = *SWAP.b; \
    *SWAP.b = SWAP.t; \
} while (0)
于 2015-03-27T15:09:32.683 に答える