我用 C 语言编写了交换函数。
void swapping(int dim, int size, void *n1, void *n2) {
int s = dim * size;
char a[s];
memcpy(a, n2, s);
memcpy(n2, n1, s);
memcpy(n1, a, s);
}
我可以说:
double t[10][3];
// write some value to array
当我交换两个元素时:
swapping(3, sizeof(double), &t[1], &t[2]);
和printf
他们在控制台上。我并不是在每个地方都得到了正确的值。
例如:与
t[1][3] = { 123.0000, 324.1231, 923.9992};
我得到了:
123.0000120, 324.1231029, 923.999350
问题出在哪里?
附注我用过void *
因为我想在不同类型中使用这个函数。
最佳答案
一些事先的想法
首先,您不能将 so 值分配给数组,这仅在初始化它们时才起作用。所以,
t[1][3] = { 123.0000, 324.1231, 923.9992};
是编译错误。您必须将它们一一分配(例如在循环中)
t[1][0] = 123.0000;
t[1][1] = 324.1231;
t[1][2] = 923.9992;
您的问题
这是一个link到 ideone 编译器,以便您可以观察到不同的最终结果。基本上,它打印:
t2: 123.000000
t2: 324.123100
t2: 923.999200
由于操作系统管理可用空间的方式,逗号后的最后两个数字很糟糕。它实际上并没有删除或真正释放它,它只是将其标记为免费
或可写,因为这样效率更高(不不必要的操作),易于实现(链表),最后,它无需额外的磁盘写入即可实现文件恢复。
这就是为什么您得到的结果很可能与 00
不同。这也来自 C 中 float / double 的默认表示。
For a, A, e, E, f and F specifiers: this is the number of digits to be printed after the decimal point (by default, this is 6).
解决方案
将精度限制为逗号后的前 4 位数字
printf("t2: %.4f\n", t[2][i]);
关于C 交换二维数组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35100988/