堆栈粉碎检测/分段故障

时间:2018-04-18 13:22:48

标签: c++ c

为什么我输入21个元素并且工作正常?如果我输入22则出现分段错误/堆栈粉碎。(OS Linux)。如果我只分配了20个元素。 我尝试过某种在线编译器,我甚至可以编写更多元素。

我的逻辑是,如果我们有20个元素,那么我们有从索引0到索引19的数组元素,20个索引由机器自动写入'\ 0'。

你能告诉我它是如何运作的。为什么它允许写入未分配的位置。为什么堆栈粉碎/分段错误出现在22个元素而不是21个元素上。

或者,请您告诉我,我必须使用哪些书籍来查找有关的信息。

下面有一段代码。

int n, i;
int a[20];

printf("Enter no of emelents of array\n");
scanf("%d", &n);
printf("\nEnter %d elements: ", n);
for(i = 1; i <= n; i++)
{
    scanf("%d", &a[i]);
}

1 个答案:

答案 0 :(得分:1)

请注意,您正在从索引1写入n并包括n。 因此,如果您输入X(让我们说,20),您的最后一个元素将被写入数组的第X + 1个索引。

话虽这么说,从数组边界访问索引会导致未定义的行为(正如@Bathsheba已经提到的那样)。

在您的情况下访问第21个索引时没有发生分段错误的原因可能是因为您的数组已在堆栈中分配,正在访问已分配的内存(可能是n,i,甚至是程序)或堆叠计数器)。

其他问题已经提出过这个问题,例如this one