什么是Segmentation Fault?提前声明变长数组触发该错误的原因
问题原因分析
你的代码触发段错误的核心问题很明确:
- 你在
int N,A[N],i;这行声明变长数组A[N]时,变量N还没被赋值,它的初始值是栈内存里的随机垃圾值。 - 用这个不确定的垃圾值作为数组长度,会导致
A的内存大小完全不可控:要么数组太小,后续输入元素时越界访问非法内存;要么数组太大,直接耗尽栈空间——这两种情况都会触发Segmentation Fault。
修复代码
把数组声明移到scanf给N赋值之后,也就是启用你注释掉的那行,同时删掉前面的A[N]声明:
#include<stdio.h> int main() { int N,i; printf("Dizinin eleman sayisi : "); scanf("%d", &N); int A[N]; // 此时N已有合法输入值,数组长度确定 for ( i = 0; i < N; i++) { printf("Dizinin elemani : "); scanf("%d", &A[i]); } for ( i = 0; i < N; i++) { printf(" %d ",A[i]); } for ( i = 0; i < N; i++) { printf("\ndizinin %d. elemani : %d\n", i,A[i]); } return 0; }
额外提醒
变长数组是C99的特性,它的长度必须是已初始化的合法整数。另外栈内存空间有限,如果输入的N过大(比如上万),可能再次触发栈溢出错误,这种场景建议用malloc从堆内存动态分配数组。
内容的提问来源于stack exchange,提问作者Mehmet Ali Can Coşkun
相关产品推荐
相关产品推荐

