【问题标题】:My array displays 50 elements then i get random memory sizes, why is that?我的数组显示 50 个元素,然后我得到随机内存大小,这是为什么呢?
【发布时间】:2016-01-21 14:41:07
【问题描述】:

如果我尝试输入序列中的第 50 个数字,它会显示到第 46 个,然后生成随机数,但是当我计算两个字符中的字符时,我发现它们都等于 10,那么为什么它恰好停在 46?

我的代码:

void calculating_f(int val){
    int aray[100] = {0,1};
    int i;

    printf("%i %i ", aray[0], aray[1]);
    for (i=2; i < val; i++){
      aray[i] = aray[i - 2] + aray[i - 1];
      printf("%i ", aray[i]);
    }
}

【问题讨论】:

标签: c arrays memory out-of-memory limit


【解决方案1】:

整数溢出(假设ints 在您的系统上是 32 位)。第 46 个斐波那契数是最大的,可以放入有符号的 32 位值。

顺便说一句——你实际上并不需要一个数组。

【讨论】:

    【解决方案2】:

    [更正后的回答]
    感谢@mch 在我的回答中指出了关于使用“无符号整数数据类型”的错误。

    请使用 'unsigned long long int (64bit data type)' 和 '%llu' 格式说明符来调用 printf()。

    [更正前的回答]
    aray 根据定义存储 int 数据。

    当你给出limit val = 50,那么,当i = 47时,计算的值超过了有符号整数数据类型的最大值。

    您应该将数据类型更改为 'unsigned int' 并在 printf() 调用中的格式说明符中使用 '%u'。

    【讨论】:

    • 溢出发生在unsigned inti=48,所以这不是一个真正的选择。
    【解决方案3】:

    这是因为您使用的是 int,c 中的 int 可以容纳从 –2,147,483,648 到 2,147,483,647 的数字,但是第 47 个斐波那契数是 2971215073,超出了该范围,导致溢出。您可以尝试使用 long long,这会让您直到第 92 个斐波那契数。

    ps 如果您只想获得第 n 个斐波那契数,则不需要数组。如果您需要计算第 n 个斐波那契数,请查看矩阵求幂,如果您只需要第 n 个斐波那契数,它比您正在做的要快得多

    【讨论】:

    • 第 92 个号码 7540113804746346429 适合 long longdouble 将导致错误的数字。
    猜你喜欢
    • 2020-12-07
    • 1970-01-01
    • 2012-02-20
    • 2017-02-27
    • 1970-01-01
    • 2015-02-21
    • 2021-03-20
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多