是否存在使用取消引用指针在内存中交换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


以上是是否存在使用取消引用指针在内存中交换2个值的边缘情况?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>