【问题标题】:Getting wrong data value from array location during assignment在分配期间从数组位置获取错误的数据值
【发布时间】:2015-11-02 12:00:03
【问题描述】:

我正在做一个编程练习,我必须使用循环(非递归)来实现斐波那契数列。

虽然它无论如何都不完美,但我遇到的主要问题是我的算法。

因为变量 intBuffer 被分配了一个指针,所以它会随着 intArray[1] 的值的变化而变化,而不是保留之前的值,然后再将其分配给内存位置 intArray[0]

我曾尝试使用* 前缀来获取数据值而不是内存位置,但这会产生错误:

错误:一元'*'的无效类型参数(有'int')

代码如下:

#include <stdio.h>
int main(void)
{
    int intArray[1];
    int intRounds, intIndex, intBuffer;
    printf("How many iterations would you like me to calculate? \n");
    scanf("%d", &intRounds);

    intArray[1] = 1;
    intArray[0] = 0;

    for (intIndex = 0; intIndex <= (intRounds - 1); intIndex++)
    {
        intBuffer = intArray[1];
        intArray[1] = intArray[1] + intArray[0];
        intArray[0] = intBuffer;
        printf("Iteration %d: %d \n", (intIndex + 1), intArray[1]);
    }   

    return 0;
}

【问题讨论】:

  • 贴出有问题的代码
  • 你想要int intArray[2]。规则很简单:N 元素的数组从0 索引到N-1。如果您需要arr[0]arr[1]arr 需要为 2 个元素。

标签: c arrays loops for-loop fibonacci


【解决方案1】:

您的代码表现出未定义的行为,因为您将 intArray 定义为只有一个元素,然后您尝试访问第二个元素,通过

 intArray[1] = 1;

C 使用基于 0 的数组索引,因此对于单元素数组,索引 1 是超出分配内存的访问,将调用 undefined behaviour

也就是说,关于逻辑,在 for 循环内,您会不断地覆盖 intArray[i] 的值。

你应该

  1. 定义一个足够大的数组来保存系列长度的所有值。您可以使用指针和 malloc() 进行动态内存分配,或使用 VLA(如果支持)。
  2. 使用循环计数器intIndex 在每次迭代中索引目标元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 2019-10-08
    • 2011-01-10
    • 1970-01-01
    相关资源
    最近更新 更多