【问题标题】:C read access violation - PointersC 读取访问冲突 - 指针
【发布时间】:2022-01-10 08:51:06
【问题描述】:

我是 C 新手,对 Visual Studio Code 有点困惑。

我不明白那是什么意思。

当我在另一个编译器中运行代码时,它确实会运行。

        void swap(int* x, int *y);
        int exe1(int* num1Ptr, int* num2Ptr, int* num3Ptr);
    
        int main()
        {
            int a = 123, b = 456 , c =4;
            int* pa, * pb ,*pc;
            pa = &a;
            pb = &b;
            pc = &c; 
    
            printf("pa = %d , pb = %d, pc = %d\n", *pa, *pb, *pc);
            exe1(pa, pb, pc);
            printf("pa = %d , pb = %d, pc = %d\n", *pa, *pb, *pc);

            return 0;
        }
    
    
        void swap(int* x, int* y) {
            int temp = *x; 
            *x = *y;
            *y = *x; 
        }
    
    
        int exe1(int* num1Ptr, int* num2Ptr, int* num3Ptr) {
            if (*num2Ptr > *num1Ptr) {
                swap(*num1Ptr, *num2Ptr);
            }
            if (*num3Ptr > *num2Ptr) {
                swap(*num3Ptr, *num2Ptr);
            }
            if (*num3Ptr > *num1Ptr) {
                swap(*num3Ptr, *num1Ptr);
            }
    }

【问题讨论】:

  • 您对 swap 的调用应该传递 num1Ptr 而不是 *num1Ptr 等。您的编译器应该对此发出警告。
  • 你的swap函数从来没有使用temp,很可疑。
  • 传递 'swap' 的参数 1 使指针从整数而不进行强制转换
  • swap(*num1Ptr, *num2Ptr); --> swap(num1Ptr, num2Ptr);
  • *y = *x; --> *y = tmp;

标签: c visual-studio


【解决方案1】:

您的 swap 例程需要两个指向 int 的指针,并且您将两个 ints 传递给它。从调用中删除多余的星号:

swap(*num1Ptr, *num2Ptr);

应该阅读

swap(num1Ptr, num2Ptr);

加上Kaitou在the answer中指出的swap()内部的错误。

【讨论】:

    【解决方案2】:

    “读取访问冲突” 在我们尝试访问我们无权访问的内存地址时发生。在这种情况下是因为swap(*num1Ptr, *num2Ptr);

    这个函数需要一个指针(与内存地址相关),应该被称为swap(num1Ptr, num2Ptr);

    *num1Ptr 取消引用指针,它现在是一个整数值,而不是指向有效地址的指针。例如*num1Ptr 可以是上面代码中的123。内存地址123 上的任何内容都可能被系统使用,我们没有对其的读/写访问权限。调试器抛出访问冲突。

    编译器还应该打印警告。

    如前所述,swap 函数需要修复 *y = temp;


    与您的问题无关,exe1 按此顺序比较值

    p1 & p2 
    p2 & p3 
    p1 & p3
    

    如果这是一个排序函数,例如,第三个条件可以否定第一个条件。您可能需要更改比较顺序,如下所示:

    void swap(int* x, int* y)
    {
        int temp = *x;
        *x = *y;
        *y = temp;
    }
    
    void exe1(int* p1, int* p2, int* p3)
    {
        if (*p1 < *p2) swap(p1, p2);
        if (*p1 < *p3) swap(p1, p3);
        if (*p2 < *p3) swap(p2, p3);
    }
    
    int main()
    {
        int a, b, c;
        a = 123, b = 456, c = 4;
        exe1(&a, &b, &c); printf("%d, %d, %d\n", a, b, c);
        a = 123, b = 456, c = 4000;
        exe1(&a, &b, &c); printf("%d, %d, %d\n", a, b, c);
        return 0;
    }
    

    【讨论】:

      【解决方案3】:
      void swap(int* x, int* y) {
          int temp = *x; 
          *x = *y;
          *y = *x;  // this should be *y = temp;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-02
        • 2013-07-19
        • 1970-01-01
        相关资源
        最近更新 更多