编写数组排序函数无法修改数组值,调用出现code=3221225477错误
问题分析与修复
错误原因
返回码3221225477是Windows系统下的内存访问违规错误,根源是参数类型不匹配和指针操作逻辑错误:
- 参数类型不兼容:
Sort函数声明的第一个参数是int **arr(二级指针,指向int指针的指针),但main中传入的&arr是int (*)[10](指向包含10个int的数组的指针),两种类型完全不同,编译器会发出警告,运行时会导致指针偏移计算错误。 - 指针访问逻辑错误:函数内部用
arr[i]访问元素时,会按照二级指针的规则计算偏移(每次偏移sizeof(int*)字节),但实际传入的是数组指针,偏移逻辑完全错误,直接访问了非法内存区域。
修复方案
方案1:修改Sort函数为普通数组排序(推荐)
把函数参数改为一维指针(数组传参会自动退化为指针),直接操作数组元素即可,这是C语言中排序数组的常规写法:
#include <stdio.h> void Sort(int *arr, int len) { int ech = 1; while (ech != 0) { ech = 0; for (int i = 0; i < len - 1; i++) { if (arr[i] > arr[i + 1]) { int temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; ech++; } } } } int main() { int arr[10] = {100, 30, 100, 17, 11, 12, 7, 18, 200, 25}; Sort(arr, 10); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
方案2:保留二级指针(仅作演示,无必要)
如果非要用二级指针,需要先构建一个指向数组每个元素的指针数组,再传入Sort函数:
#include <stdio.h> void Sort(int **arr, int len) { int ech = 1; while (ech != 0) { ech = 0; for (int i = 0; i < len - 1; i++) { if (*(arr[i]) > *(arr[i + 1])) { int temp = *(arr[i]); *(arr[i]) = *(arr[i + 1]); *(arr[i + 1]) = temp; ech++; } } } } int main() { int arr[10] = {100, 30, 100, 17, 11, 12, 7, 18, 200, 25}; // 构建指针数组,每个元素指向arr的对应元素 int *ptr_arr[10]; for (int i = 0; i < 10; i++) { ptr_arr[i] = &arr[i]; } Sort(ptr_arr, 10); for (int i = 0; i < 10; i++) { printf("%d ", arr[i]); } return 0; }
关键说明
- 普通数组排序不需要二级指针,直接使用一维指针即可,代码更简洁高效。
- 指针类型匹配是C语言中必须严格遵守的规则,类型不匹配会导致未定义行为,运行时崩溃是常见结果。
内容的提问来源于stack exchange,提问作者ilias pr0
相关产品推荐
相关产品推荐

