You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复C++中的Access Violation Error?指针实现数组反转报错

数组反转代码的访问违规错误修复及问题解析

核心错误根源:函数传参完全错误

main函数里的swap_elements(*array, SIZE);是触发访问违规的直接原因:

  • *array等价于array[0],是数组第一个元素的整数值,但swap_elements的第一个参数要求是int *类型的数组指针。把整数强行传给指针参数后,函数内部的array指针会指向一个非法地址(如果第一个元素是0,就会指向0x00000000,正好对应你报错的访问0地址),后续对array的读写操作必然触发Access Violation。
  • 正确传参应该是swap_elements(array, SIZE);——数组名array会隐式转换为指向第一个元素的指针,符合函数参数要求。

swap_elements函数内部的其他错误

  1. 越界的指针/下标访问

    • &array[-1]和array[-i]都是访问数组范围外的非法内存:C语言数组下标从0开始,负数下标会指向数组起始地址之前的区域,直接触发访问错误。
    • 正确的末尾元素指针应该是&array[size - i](或array + size - i),对应第i个要交换的末尾位置。
  2. 指针与整数的错误赋值

    • int val1 = element1Ptr;是把指针的地址值直接赋值给int变量,这不是你要的数组元素值,正确写法是int val1 = *element1Ptr;(通过指针解引用获取元素内容),val2同理。
  3. 无效的交换逻辑

    • 你当前的array[i - 1] = val1;是把原元素值又写回去,等于没交换。正确的交换应该是把val2赋值给前位,val1赋值给后位。
  4. 硬编码的SIZE宏

    • 函数内的打印循环用了固定的SIZE,但函数参数已经有size,应该用size遍历,让函数支持任意长度的数组。

修正后的完整代码

#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[size - i];
        // 解引用指针获取元素值
        int val1 = *element1Ptr;
        int val2 = *element2Ptr;
        // 交换两个位置的元素
        *element1Ptr = val2;
        *element2Ptr = val1;
    }
    puts("Array after reversing:");
    // 使用参数size而非硬编码SIZE
    for (int i = 0; i < size; i++) {
        printf("%5d", array[i]);
    }
    puts("");
}

额外优化建议

  • 可以直接通过指针完成交换,省去额外的val变量,更符合指针练习的要求:
    int temp = *element1Ptr;
    *element1Ptr = *element2Ptr;
    *element2Ptr = temp;
    
  • 输入时可以增加scanf的返回值检查,避免非法输入导致程序异常。

内容的提问来源于stack exchange,提问作者JacobS19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:13:12