我需要编写一个函数来替换 2 个未知类型的“数字”。
我不知道确切的类型,我只能使用 2 个参数。
所以这是我尝试过的:
void swap(void *p1, void *p2)
{
char p;
char * q1 = (char *)p1;
char * q2 = (char *)p2;
for (int i = 0; i < sizeof(long double); i++)
{
p = q1[i];
q1[i] = q2[i];
q2[i] = p;
}
}
用法:
double a = 100123000000.2;
double b = 100065450000.3;
printf("a: %1f, b: %1f\n", a, b);
swap(&a, &b)
printf("a: %1f, b: %1f\n", a, b);
这很好用,但我的问题是如果我的 number
比 long double
大怎么办(或者没有人..)
我的解决方案可以吗?
最佳答案
This works fine but my question is what if my number is bigger (?)
Is my solution is OK ?
除非知道确切的大小,否则代码会遇到麻烦。所以,不,OP 的解决方案不可行。
void swap()
需要知道要交换的数据的大小。
i can only use 2 parameters.
自 C99 以来,代码可以作弊并将所有数据作为复合文字放入1参数。
typedef struct {
void *a;
void *b;
size_t sz;
} swap_T;
// Only 1 parameter!!
void swap(swap_T sw) {
unsigned char * q1 = sw.a;
unsigned char * q2 = sw.b;
while (sw.sz > 0) {
sw.sz--;
unsigned char p = q1[sw.sz];
q1[sw.sz] = q2[sw.sz];
q2[sw.sz] = p;
}
}
int main(void) {
double a = 100123000000.2;
double b = 100065450000.3;
printf("a: %g, b: %g\n", a, b);
swap(((swap_T ) { &a, &b, sizeof a } )); // Compound literal
printf("a: %g, b: %g\n", a, b);
return 0;
}
输出
a: 1.00123e+11, b: 1.00065e+11
a: 1.00065e+11, b: 1.00123e+11
代码可以将 swap(((swap_T ) { &a, &b, sizeof a } ))
包装在一个看起来像 2 的函数调用的宏中
#define SWAP(a,b) (swap(((swap_T ) { &(a), &(b), sizeof (a) } )))
...
SWAP(a,b);
只要 a
不是带有可变逻辑数组 (VLA) 且有副作用的表达式,宏就应该可以正常工作。
当然,最好 a,b
是同一类型。
关于c - 如何通过两个 void 指针参数交换 2 个未知确切类型的数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48794397/