【问题标题】:Reason why this C program stopped working [duplicate]这个C程序停止工作的原因[重复]
【发布时间】:2016-02-26 06:12:58
【问题描述】:

我想知道为什么当我增加数组 a[] 的值时这个程序停止工作 如果有,请告诉我如何在不崩溃的情况下增加这个值 谢谢

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{

    int i, j, save;
    char a[2082001];
    memset(a,'1',2082000);
    for (i=2;i<=2082000;i++)
    {
        if (a[i]=='1')
        {
            save=i;
            for (j=i*2;j<=2082000;j+=i)
                a[j]='0';
        }
    }
    printf("save = %d",save);
    return 0;
}

【问题讨论】:

  • 可能是堆栈溢出。尝试在char a[2082001] 之前添加static 并查看程序是否崩溃以确定它是否是原因。
  • 让我猜猜,你在 Windows 上尝试这个,每个进程只有 1MB 的默认堆栈空间?现在尝试猜测当您尝试在堆栈上创建一个 2MB 数组时会发生什么。
  • “增加价值”是什么意思?你是怎样做的?当前程序运行没有问题...
  • 解决堆栈溢出问题后,将memset(a,'1',2082000); 更改为memset(a, '1', 2082001); 或者最好是memset(a, '1', sizeof a);
  • '停止工作' - 什么?错误消息。请!

标签: c


【解决方案1】:

基本有符号整数类型。至少能够包含 [−32767, +32767] 范围;因此,它的大小至少为 16 位,

这使 j 超出范围。

【讨论】:

  • 很久以前int只有16位。在生产中的任何 32 位系统(以及现在的 64 位系统)上,过去 30 年左右 int 是 32 位。顺便说一句,你显示的范围是错误的,它下降到 -32768。
  • @JoachimPileborg 范围没有错。见 N1256 5.2.4.2.1,它说INT_MIN 的绝对值最小的是-32767
  • @MikeCAT 在互补系统上是的。虽然周围很少,我猜甚至少于 16 位系统。 :)
猜你喜欢
  • 1970-01-01
  • 2021-12-07
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-14
  • 2023-04-03
  • 2012-08-28
  • 2017-07-07
相关资源
最近更新 更多