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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:35:30