使用void**的通用交换尝试

Leo*_*ito 1 c swap void-pointers

我试图通过交换指针的地址来交换任何给定类型的两个值.

我提出的函数在调用任何两个整数时工作正常,但是当在同一范围内定义更多整数时,行为很奇怪(至少对我来说).例如,考虑一下这个SSCCE:

#include <stdio.h>

static inline void exchx(void** a, void** b) { void* p = *a; *a = *b; *b = p; }

int main(void) {
    int a = 1;
    int b = 2;
    int c = 3;
    int d = 4;

    printf("\nBefore: abcd = %d, %d, %d, %d", a, b, c, d);
    exchx((void**)&a,(void**)&b);
    printf("\nAfter: abcd = %d, %d, %d, %d\n", a, b, c, d);
}
Run Code Online (Sandbox Code Playgroud)

我希望第二次打印是"2,1,3,4",但我得到了这个:

Before: abcd = 1, 2, 3, 4
After: abcd = 2, 1, 2, 4
Run Code Online (Sandbox Code Playgroud)

我确信有更多更方便的交换数据 - 这根本不是问题 - 我只是对这种行为感到好奇.有任何想法吗?

小智 5

在你的代码中,这一行

exchx((void**)&a,(void**)&b);
Run Code Online (Sandbox Code Playgroud)

指向int指针强制转换为指向void指针的指针.这只是意味着你int被解释为它是一个指针.期待任何奇怪的行为.

简而言之,您的exchx函数可以很好地交换实际指针 ......而不是其他任何东西.