C 读取访问冲突 - 指针

Posted

技术标签:

【中文标题】C 读取访问冲突 - 指针【英文标题】:C read access violation - Pointers 【发布时间】: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; 【参考方案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;

【讨论】:

以上是关于C 读取访问冲突 - 指针的主要内容,如果未能解决你的问题,请参考以下文章

访问指向结构的指针会导致内存读取冲突

C++ 读取访问冲突。 _Val 为 nullptr [关闭]

不能将数组运算符用于基于数组的指针(读取访问冲突)

访问冲突读取位置 0x00000000 cstrings

0xC0000005: 读取位置 0x00000000 时发生访问冲突

C ++访问冲突读取位置0xcdcdcdcd调用函数时出错