检测到堆栈粉碎,堆芯被丢弃

时间:2018-08-27 15:29:01

标签: c arrays

 #include<stdio.h>
 #define MAXSIZE 10 
 #define OK 1
 #define NOK 0
int check_validity(int);
void input_array_elements(int,int *);
void Display_array_elements(int,int *);

int main()
{
 int array[MAXSIZE];
 int i,num,negative_sum=0,positive_sum=0;
 float total=0.0,average;
 printf("Enter the value of N\n");
 scanf("%d",&num);
 while(1)
 {
  int Return_val;
  Return_val=check_validity(num);
  if(Return_val == OK)
  {
    printf("sizeof array=%d\n",sizeof(array));
    break;
  }
  else
  {
   printf("please enter a value <= 10\n");
   scanf("%d",&num);
  }
 }
 input_array_elements(num,&array[MAXSIZE]);
 Display_array_elements(num,&array[MAXSIZE]);
}

int check_validity(int num)
{
 if(num<MAXSIZE)
 {
  printf("OK\n");
  return OK;
 }
 else
 {
  printf("NOK\n");
  return NOK;
 }
}

void input_array_elements(int num,int *array)
{
 int i;
 for(i=0;i<num;i++)
 {
  scanf("%d",&array[i]);  
 }
}

void Display_array_elements(int num,int *array)
{
 int i;
 for(i=0;i<num;i++)
 {
  printf("array[%d]=%d\n",i,array[i]);
 }
}

什么是“堆栈粉碎”?如何解决这个问题?

我正在编译程序,但出现错误:

* stack smashing detected *: ./a.out terminated Segmentation fault (core dumped)

我不知道我在做什么错。

3 个答案:

答案 0 :(得分:6)

指向&array[MAXSIZE]的指针是指向数组末尾的一个指针。这意味着您的函数将超出导致undefined behavior的数组范围。系统检测到这是“堆栈粉碎”并崩溃了。

如果您想将指针传递到第一个元素,请使用&array[0]或普通array(因为它将衰减为&array[0])。

答案 1 :(得分:0)

当分配的内存空间超出一个变量时,将出现分段错误。声明变量后,将在堆栈中分配内存量。 您的阵列导致了问题。因此,将数组定义为特定大小,然后在空间上方插入下一个,并尝试访问onother变量/指令的空间。

答案 2 :(得分:0)

当您尝试访问程序或进程无法访问的内存时,就会发生分段错误(或在获取堆栈时发生粉碎)。

在您的函数Display_array_elements中,我想您正在尝试打印数组元素。第二个参数应该提供数组开头的地址。

通过传递&array[MAXSIZE],您已经指向最后一个元素,然后尝试访问此数组上的其他元素,这超出了有效的数组范围。这就是分割错误的原因。

将此通话更改为以下选项之一

Display_array_elements(num,&array[0]);

OR

Display_array_elements(num,array);