使用C语言指针实现数组反转时出现Segmentation Fault错误,求解决方案
C语言指针实现数组反转触发段错误的解决方案
我编写了一段使用C语言指针实现数组反转的代码,但运行时出现“Segmentation fault (core dumped)”错误。以下是示例输入及代码,恳请各位提供该错误的解决方案:
示例输入
请输入数组大小:3 请输入3个元素: 4, 5, 7 Segmentation fault (core dumped)
原代码
#include <stdio.h> int main(void){ int size, i; int *pointer; int arr[size]; printf("Please enter the array size: "); scanf("%d/n", &size); pointer = &arr[0]; printf("Please enter %d elements:\n", size); for(i = 0; i < size; i++){ scanf("%d", arr[i]); pointer++; } pointer = &arr[size - 1]; printf("The reversed array is\n"); for(i = size; i > 0; i--){ printf("%d", arr[i]); pointer--; } return 0; }
错误原因及修复方案
1. 变长数组定义时机错误
代码中先定义int arr[size];,但此时size未初始化,是随机值,导致数组大小不确定,后续操作极易越界。
修复:先通过scanf读取size的值,再定义数组:
printf("请输入数组大小:"); scanf("%d", &size); int arr[size]; // 此时size已被正确赋值
2. scanf格式串错误
原代码scanf("%d/n", &size);中的/n是无效格式,会导致输入后无法正常结束读取,甚至引发后续逻辑异常。scanf会自动跳过空白字符,无需在格式串中添加\n。
修复:改为scanf("%d", &size);
3. scanf参数传递错误
读取元素时scanf("%d", arr[i]);,scanf要求传入变量的地址,但arr[i]是元素的值,传入非法地址直接触发段错误。
修复:改为传递元素地址scanf("%d", &arr[i]);,或者利用指针直接传递scanf("%d", pointer);(贴合指针用法)
4. 数组下标越界访问
输出反转数组时,循环初始值i = size,此时arr[i]超出数组下标范围(数组合法下标为0到size-1),越界访问触发段错误。
修复:调整循环逻辑,从最后一个合法下标开始遍历:
printf("反转后的数组是:"); for(i = size - 1; i >= 0; i--){ printf("%d ", arr[i]); }
或者用指针实现:
pointer = &arr[size - 1]; printf("反转后的数组是:"); for(i = 0; i < size; i++){ printf("%d ", *pointer); // 解引用指针获取元素值 pointer--; }
5. 输入分隔符兼容问题
示例输入用逗号分隔元素,原代码scanf("%d")会将逗号视为非法字符,导致后续元素读取失败。可修改格式串兼容逗号或空格分隔:
修复:使用scanf("%d%*c", pointer);忽略元素后的任意分隔符(逗号、空格等)
修复后的完整代码
#include <stdio.h> int main(void){ int size, i; int *pointer; printf("请输入数组大小:"); scanf("%d", &size); int arr[size]; pointer = &arr[0]; printf("请输入%d个元素(用空格或逗号分隔):\n", size); for(i = 0; i < size; i++){ scanf("%d%*c", pointer); pointer++; } pointer = &arr[size - 1]; printf("反转后的数组是:"); for(i = 0; i < size; i++){ printf("%d ", *pointer); pointer--; } printf("\n"); return 0; }
内容的提问来源于stack exchange,提问作者ksuk333
相关产品推荐
相关产品推荐

