通过将指针传递给交换函数来交换两个整数的C代码

时间:2011-11-03 12:18:30

标签: c pointers

我在解决练习测试时遇到了这个问题

考虑这个C代码来交换两个整数和这五个语句:

void swap (int *px, int *py) {

*px = *px – *py;

*py = *px + *py;

*px = *py – *px;

}

S1:将生成编译错误

S2:可能会在运行时根据传递的参数生成分段错误

S3:正确实现所有输入指针的交换过程,引用存储在进程可访问的内存位置的整数

S4:对某些但不是所有有效的输入指针正确实现交换过程

S5:可以加或减整数和指针。

以上哪个陈述是正确的?

我认为S2和S3。任何人都可以确认

4 个答案:

答案 0 :(得分:3)

我不相信S3会持有,因为如果你用px == py来调用它,它只会在第一行中将整数设置为0(*px = *px - *py则相当于*px = *px - *px这显然在*px中存储了0。将所有输入数据设置为0后,它无法恢复并重新生成该值。

答案 1 :(得分:2)

S1: False, the code will compile
S2: True, never checks for NULL
S3: False, as unwind pointed out, if px == py it would fail
S4: True for the case cited above
S5: False, never subtracts any pointers

编辑:我错误地说代码没有交换:)

答案 2 :(得分:1)

您非常接近,但知道(签名)整数溢出会产生未定义的行为。这可能会略微改变你的答案。

答案 3 :(得分:0)

  • S2是真的。
  • S4为真,因为别名问题导致S3为假。
  • 休息是假的

如果没有别名问题,它实际上会交换值:

px | PY
-------------------------------------------------- -----------------------------
px:= px-py |
| py:= px + py => px-py + py = px
px:= py-px => px-(px-py)= py |