如何操作使用malloc声明的int数组?

时间:2011-09-06 00:35:35

标签: c arrays malloc int

我有这段代码:

// Returns the fibonacci range until the specified limit
int fibo(int** output, int limit)
{
    // Must be 1 or more
    if(limit < 1) return 0;

    int* range = (int*)malloc(sizeof(int) * limit);
    assert(range);

    int i;

    // Calculate the range
    for(i = 0; i < limit; i++)
    {
        int value;

        if(i == 0)  value = 0;
        if(i == 1)  value = 1;
        else        value = range[i - 2] + range[i - 1];

        range[i] = value;
    }

    *output = range;

    return 1;
}

使用限制15输出

运行它
  

65,1,66,67,133,200,333,533,866,1399,2265,3664,5929,9593,15522

这根本不对。我怀疑这是因为我写的是像range[i - 2]这样的东西,而这不是我应该做的。我尝试使用int的大小作为每个值之间的跳跃并得到分段错误。我正确使用[]吗?任何人都可以想到为什么我的输出很奇怪?

Here's all the code for the program

3 个答案:

答案 0 :(得分:1)

更改

if(i == 1)  value = 1;

else if(i == 1)  value = 1;

编辑: 刚刚意识到这已在评论中得到解答。

答案 1 :(得分:0)

问题在于你的ifs你有两个if语句

if(i == 0)  value = 0;

if(i == 1)  value = 1;
  else        value = range[i - 2] + range[i - 1];

如果i为0,则第二个if计算范围[-2] +范围[-1],因此来自内存的未定义数据

你需要使用else,这样它只是一个if语句(也作为一个样式点始终使用{}来使事情更清晰)

if(i == 0) {  
   value = 0;
} else if(i == 1) {
   value = 1;
} else {
   value = range[i - 2] + range[i - 1];
}

在这个例子中,在循环之前设置范围[0]和[1]可能更好,并且在2处开始循环,因此不需要if。

答案 2 :(得分:0)

您在elseif (i==0)之间缺少if (i == 1),因此第一次通过0案例和2 +案例都会运行。