如何修复 C++ 中的访问冲突错误

问题描述 投票:0回答:1

我有一个作业,其中我必须获取一个数组并反转它的顺序。我们应该使用指针来完成此任务,但我的代码的一部分遇到了问题。在第 26 行,我尝试将数组元素重新分配给新值,但当我尝试时,出现访问冲突错误“HW7_JacobS.exe 中 0x00007FF60459600D 处未处理的异常:0xC0000005:访问冲突写入位置 0x0000000000000000。”

#include <stdio.h>
#define SIZE 10

void swap_elements(int *array, size_t size);

int main(void) {
    puts("Enter elements of the array and the code will reverse the array.");
    int array[SIZE];
    for (int i = 0; i < SIZE; i++) {
        printf("Enter element %d: ", i);
        scanf("%d", &array[i]);
    } 
    puts("Array before reversing:");
    for (int i = 0; i < SIZE; i++) {
        printf("%5d", array[i]);
    } puts("");
    swap_elements(*array, SIZE);
 }

void swap_elements(int *array, size_t size) {
    for (int i = 1; i <= size / 2; i++) {
        int *element1Ptr = &array[i - 1];
        int *element2Ptr = &array[-1];
        int val1 = element1Ptr;
        int val2 = element2Ptr;
        array[i - 1] = val1; // Here is the problem
        array[-i] = val2;
    }
    puts("Array after reversing:");
    for (int i = 0; i < SIZE; i++) {
        printf("%5d", array[i]);
    }
}

我原本期望代码将 array[i - 1] 重新分配给 val1,但代码却中断并在调试模式下给出此错误。

c++ access-violation
1个回答
0
投票

这是 C 代码,如果您的文件具有

.c
扩展名,您可能会将其编译为 C。
swap_elements(*array, SIZE);
是赠品,
*array
的结果是您尝试从指针投射的
int
广告。 C 编译器会告诉你:

prog.c:18:19: warning: passing argument 1 of 'swap_elements' 
makes pointer from integer without a cast [-Wint-conversion]

从这里开始,您的代码将导致 UB,例如地址冲突,因为

swap_elements
访问了一些不存在的对象。

在 C++ 中,由于存在多个错误,此代码根本无法编译。

虽然

array[-i]
是正确的语法,但它假设
*(array-i)
是正确的位置,但在您的情况下
array
指向数组的开头。 C 和 C++ 中的负索引与 Python 中的负索引不同。

© www.soinside.com 2019 - 2024. All rights reserved.