2017-06-14 96 views
0

我通过Internet在数组中插入一个元素的下面的代码。我的问题是,怎么可能数组的大小增加了,特别是在第一次插入时,并且每次执行循环打印时都会打印一个垃圾。我也渴望获取有关所得错误的详细信息。“***堆栈粉碎检测***:./a.out终止中止(核心转储)” - 阵列内插

该代码是

#include <stdio.h> 
void main() 
{ 
    int k = 3, n = 5, i = 0, j = n; 
    int LA[] = {1,3,5,7,8}; 
    printf("The original array elements are :\n"); 
    for(i = 0; i<n; i++) { 
     printf("%d ",LA[i]); 
    } 
    n = n + 1; 
    while(j >= k){ 
     LA[j+1] = LA[j]; 
     j = j - 1; 
    } 
    LA[k] = 10; 
    printf("\nThe array elements after insertion1 :\n"); 
    for(i = 0; i<n; i++) { 
     printf("%d ",LA[i]); 
    } 
    n = n + 1; 
    while(j >= k){ 
     LA[j+1] = LA[j]; 
     j = j - 1; 
    } 
    LA[k] = 20; 
    printf("\nThe array elements after insertion2 :\n"); 
    for(i = 0; i<n; i++) { 
     printf("%d ",LA[i]); 
    } 
    n = n + 1; 
    while(j >= k){ 
     LA[j+1] = LA[j]; 
     j = j - 1; 
    } 
    LA[k] = 30; 
    printf("\nThe array elements after insertion3 :\n"); 
    for(i = 0; i<n; i++) { 
     printf("%d ",LA[i]); 
    } 
} 

输出是

The original array elements are : 
1 3 5 7 8 
The array elements after insertion1 : 
1 3 5 10 7 8 
The array elements after insertion2 : 
1 3 5 20 7 8 2087809280 
The array elements after insertion3 : 
*** stack smashing detected ***: ./a.out terminated 
1 3 5 30 7 8 2087809280 -1077687568 Aborted (core dumped) 

感谢UR时间。

+0

细节是你破坏堆栈。查找“粉碎堆栈以获得乐趣和利润”。 (免责声明:我还没有读取代码) –

回答

3

您已经声明大小的数组LA 5.

int LA[] = {1,3,5,7,8}; 

后来,你的代码试图添加额外的元素,然而,LA的大小仍然是5,那么你将值数组空间你没有分配。

然后有机会,数组被分配到堆栈上,并且由于您正在写入不属于数组一部分的区域,所以您正在搞乱堆栈。

任何printf的访问超出了LA大小指标将是什么恰好是在那个位置内存错误

+0

我认为程序只在第一个while循环期间写入数组的末尾。然后,他只是从阵列末尾格式化printf。然后主要尝试退出并意识到堆栈已损坏(尽管只有四个字节)。 –