【问题标题】:Why is that crashing ? (buffer overflow)为什么会崩溃? (缓冲区溢出)
【发布时间】:2014-02-10 16:24:26
【问题描述】:
#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

【问题讨论】:

  • scanf("%d ", n); 必须是 scanf("%d", &amp;n);

标签: c


【解决方案1】:

这个:

scanf("%d ", n);

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

scanf("%d ", &n);

其余的scanf() 电话也是如此。此外,在依赖包含有效值的变量之前,您应该检查返回值以知道它成功读取了数据。

【讨论】:

    【解决方案2】:

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

    改为这样做:

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

    【讨论】:

      【解决方案3】:

      他们说scanf 需要地址。而且,这是在做什么?

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

      n 是每个数组中元素的数量,所以调用b[n] 会给你一个(可能是未通知的)问题。编译器往往不会警告这种越界访问(请参阅this post)。

      我怀疑您打算将b 复制到a 中,而不是复制一个值到a 的每个元素,但这纯粹是推测,因为您尚未声明预期的输入或输出是什么。

      【讨论】:

        【解决方案4】:

        为什么会崩溃?

        Wiki 说:

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

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

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

        在你的程序中,语句

        scanf("%d ", n);  
        

        和

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

        导致您的程序崩溃。

        正如其他人建议的那样,将 &amp; 运算符放在 scanf 参数之前

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多