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

程序出现segmentation fault(core dumped)求助:两段循环共存致崩溃?

解决C语言程序中的Segmentation Fault问题

嘿,我一眼就揪出了问题的根源——你在声明变量长度数组(VLA)的时候,size还没被初始化!

问题原因详解

看你的main函数开头:

int size;
int numbers[size];
int numbers2[size];

这里的size是未初始化的局部变量,它的初始值是内存里的随机垃圾数据。这意味着你创建的numbers和numbers2数组的大小是一个完全不可控的随机值,可能极小也可能大到离谱。

之后你用scanf读取了用户输入的size,但这时候数组的大小已经固定下来了,不会跟着size的真实值更新。当你后续用输入的size去遍历数组时,大概率会出现数组越界访问:如果初始随机的数组大小比你输入的size小,循环到后面的元素时,你就会触碰数组之外的内存区域,直接触发segmentation fault。

修复方案

把数组的声明移到scanf读取size之后就行!这样数组的大小会严格对应你输入的数值,彻底避免越界问题。

修正后的完整代码

#include <stdio.h>

void abs_numbers(int size, int v[], int v2[]) {
    for (int i = 0; i < size; ++i) {
        v2[i] = v[i];
        if (v2[i] < 0) {
            v2[i] = v[i] * (-1);
        }
    }
}

int main() {
    int size;
    printf("Size of numbers: \n");
    scanf("%d", &size);
    // 把数组声明移到读取size之后,确保大小准确
    int numbers[size];
    int numbers2[size];
    
    for (int i = 0; i < size; ++i) {
        printf("%d. number: ", i + 1);
        scanf("%d", &numbers[i]);
    }
    
    abs_numbers(size, numbers, numbers2);
    
    printf("Abs of numbers: ");
    for (int k = 0; k < size; ++k) {
        printf("%d", numbers2[k]);
        if (k < size - 1) {
            printf(", ");
        }
    }
    puts("");
    
    printf("Numbers: ");
    for (int l = 0; l < size; ++l) {
        printf("%d", numbers[l]);
        if (l < size - 1) {
            printf(", ");
        }
    }
    puts("");
    
    return 0;
}

额外小建议

如果你的编译器不支持C99及以后的标准(变量长度数组是C99引入的特性),可以改用动态内存分配来创建数组,兼容性更强,还能避免大尺寸数组导致的栈溢出:

// 替换数组声明的部分
int *numbers = malloc(size * sizeof(int));
int *numbers2 = malloc(size * sizeof(int));

// 使用完数组后记得释放内存
free(numbers);
free(numbers2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 07:22:29