是否存在使用取消引用指针在内存中交换2个值的边缘情况?
我用 C 编写了这个简单的函数来交换内存中 2 个地址中的值:
void pointersswap (int *ptr1, int *ptr2)
{
*ptr1 = *ptr1*(*ptr2);
*ptr2 = *ptr1/(*ptr2);
*ptr1 = *ptr1/(*ptr2);
}
有人告诉我,该程序可能会遇到“边缘情况”。您可以假设输入是正确的(ptr1 和 ptr2 实际上保存地址值,这些地址指向内存,其中有 2 个不是 0 的整数)。数学总是检查出来,即使被解引用的指针持有负数,或者两者都是负数或分数。
作为参考,此代码不应有相同的问题/边缘情况:
void pointersswap (int *ptr1, int *ptr2)
{
int temp = *ptr1;
*ptr1 = *ptr2;
*ptr2 = temp;
}
我错过了什么?第一个函数真的有任何限制/边缘情况吗?
小说明:假设没有信息溢出/丢失。
回答
首先,像这样的“表达式”*ptr1/*ptr2不起作用,因为它/*被解释为 C 中注释的开始。
替换/*为 后/ *,(至少)在两种情况下该函数不起作用:
- 当乘法溢出时。
- 当指向同一个变量的指针同时传递给
a和 时b。
#include <stdio.h>
void pointersswap (int *ptr1, int *ptr2)
{
*ptr1 = *ptr1*(*ptr2);
*ptr2 = *ptr1/ *ptr2;
*ptr1 = *ptr1/ *ptr2;
}
int main(void) {
int a, b;
a = 999999; b = 888888;
printf("before: a = %d, b = %dn", a, b);
pointersswap(&a, &b);
printf("after ; a = %d, b = %dn", a, b);
a = 12345;
printf("before: a = %dn", a);
pointersswap(&a, &a);
printf("after : a = %dn", a);
return 0;
}
输出:
before: a = 999999, b = 888888
after ; a = 891245, b = -192
before: a = 12345
after : a = 1