为什么会崩溃? (缓冲区溢出)

时间:2014-02-10 16:24:26

标签: c

#include <stdio.h>
#define N 100

int main()
{
 int n,c,d,a[N],b[N];

printf("Insert elements numbers in the array\n");
 scanf("%d ", n);

printf("Insert the elements in the array\n");

for (c = 0; c < n ; c++)
scanf("%d", a[c]);

for (c=n-1,d = 0;d < n; c--,d++)
b[d]= a[c];

for(c = 0; c <n; c++)
a[c] = b[n];

printf("The array inverted is\n");

for(c=0; c<n;c++)
printf("%d\n",a[c]);

return 0;
}

为什么会崩溃?即使有价值(N <100)我仍然尝试但仍然崩溃,我不知道如何解决它?有谁可以帮助我吗 ?谢谢!

4 个答案:

答案 0 :(得分:6)

此:

scanf("%d ", n);

调用未定义的行为。 scanf()需要一个指向数字存储位置的指针,它应该是:

scanf("%d ", &n);

其他scanf()来电也是如此。此外,在依赖包含有效值的变量之前,应检查返回值以了解它是否成功读取了数据。

答案 1 :(得分:3)

scanf需要写入地址,而不是实际值。

请改为:

scanf("%d", &a[c]);

答案 2 :(得分:0)

他们对scanf需要地址的说法。但是,这是做什么的?

for(c = 0; c <n; c++)
  a[c] = b[n];

n是每个数组中元素的数量,因此调用b[n]会给您一个(可能是未宣布的)问题。编译器倾向于不警告那种超出范围的访问(参见this post)。

我怀疑你打算将b复制到a,而不是将一个值复制到a的每个元素,但这纯粹是猜测,因为你没有宣布预期的内容输入或输出是。

答案 3 :(得分:0)

  

为什么会崩溃?

Wiki说:

  

计算中的崩溃(或系统崩溃)是指计算机或程序(例如软件应用程序或操作系统)无法正常运行。通常情况下,它会在遇到这些错误后退出。负责的程序可能会冻结,直到崩溃报告服务记录崩溃的详细信息。如果程序是操作系统内核的关键部分,整个计算机可能会崩溃,通常会导致致命的系统错误。此行为称为“崩溃”。

     

导致应用程序崩溃的典型错误包括:

     
      
  • 尝试读取或写入未分配给该应用程序读取或写入的内存(分段错误)或x86特定(一般保护错误)
  •   
  • 尝试执行特权或无效指令
  •   
  • 尝试在无权访问的硬件设备上执行I / O操作
  •   
  • 将无效参数传递给系统调用
  •   
  • 尝试访问应用程序无权访问的其他系统资源(总线错误)
  •   
  • 尝试使用错误的参数执行机器指令(取决于CPU架构):除以零,对denorms或NaN值的操作,对未对齐地址的内存访问等。
  •   

在你的程序中,语句

scanf("%d ", n);  

scanf("%d", a[c]);  

导致程序崩溃。

正如其他人建议在&参数

之前放置scanf运算符
scanf("%d ", &n); 
scanf("%d", &a[c]);