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

标签 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);
}

我希望第二个打印是“2, 1, 3, 4”,但我得到的却是这个:

Before: abcd = 1, 2, 3, 4
After: abcd = 2, 1, 2, 4

我确信有更明智的方式来交换数据 - 这根本不是问题 - 我只是对这种行为感到好奇。有什么想法吗?

最佳答案

在你的代码中,这一行

exchx((void**)&a,(void**)&b);

将一个指向 int 的指针 转换为一个指向 void 指针的指针。这只是意味着您的 int 被解释为就好像一个指针。预计这样做会出现任何奇怪的行为。

简而言之,您的 exchx 函数适用于交换实际的指针 ... 不适用于其他任何东西。

关于c - 使用 void 的通用交换尝试**,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32682012/

相关文章:

java - 即使在失去焦点后也能在 X11 中捕获事件

python - 在 python 中交换列表中的元素

c - 如何在 C 中保持全局存储区域类型独立?

尝试将读取的数据写入文件时出现 curl 写入错误

c - stdio header 中的 _iob 声明

c - 如何将 POSIX sem_t 信号量增加 1 以上?

c - 多线程项目结构

objective-c - 交换 NSMutableArray 中的元素

c - 交换两个字符串指针

c++ - 为什么 void* 在 C++ 中被认为是不安全的?