#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)
我不知道我在做什么错。
答案 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);