如何修复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函数内部的其他错误
越界的指针/下标访问
&array[-1]和array[-i]都是访问数组范围外的非法内存:C语言数组下标从0开始,负数下标会指向数组起始地址之前的区域,直接触发访问错误。- 正确的末尾元素指针应该是
&array[size - i](或array + size - i),对应第i个要交换的末尾位置。
指针与整数的错误赋值
int val1 = element1Ptr;是把指针的地址值直接赋值给int变量,这不是你要的数组元素值,正确写法是int val1 = *element1Ptr;(通过指针解引用获取元素内容),val2同理。
无效的交换逻辑
- 你当前的
array[i - 1] = val1;是把原元素值又写回去,等于没交换。正确的交换应该是把val2赋值给前位,val1赋值给后位。
- 你当前的
硬编码的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
相关产品推荐
相关产品推荐

