C 交换二维数组中的元素

标签 c function swap

我用 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;

您的问题

这是一个linkideone 编译器,以便您可以观察到不同的最终结果。基本上,它打印:

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/

相关文章:

c - 尝试交换字符串内容时出现段错误 11

c# - 交换 List<T> 中的两个项目

c - 更快地交换结构数组中的元素

c - 使用 Xlib 放大图像

c - 如何在 C/C++ 套接字中接收整数数组?

java - 如何给一个类一个克隆方法?克隆方法返回什么?

javascript - 两个 javascript 'changeimage' 函数,只有一个正在工作

返回 void 的函数 g 可以返回 f() 吗? f 何时返回 void?

c - Socket C 同时处理 recv() 和 send()

javascript - 使用 jQuery 时是否有用于声明函数的特殊语法?