程序出现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.
相关产品推荐
相关产品推荐

