【问题标题】:How to I operate on int arrays declared using malloc?如何对使用 malloc 声明的 int 数组进行操作?
【发布时间】:2011-09-06 00:35:34
【问题描述】:

我有这段代码:

// 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

【问题讨论】:

  • range[i-2] 可以,只要i &gt; 2。您是否尝试过在调试器中单步执行您的代码?
  • 这只是一个简单的错误。仔细考虑您的代码对 i == 0 的作用...(提示:您希望第二个臂使用“else if”)
  • 切线注释:malloc 的规范习语是 int *range = malloc(sizeof(*range) * limit)。不要强制转换,也不要引用 sizeof 中的硬编码类型。
  • 不投射?为什么不呢?

标签: c arrays malloc int


【解决方案1】:

改变

if(i == 1)  value = 1;

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

编辑: 刚刚意识到这已经在 cmets 中得到了回答。

【讨论】:

    【解决方案2】:

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

    if(i == 0)  value = 0;
    

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

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

    您需要使用 else 以便它只是一个 if 语句(也作为一种风格点,始终使用 {} 使事情更清晰)

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

    在这个例子中,在循环之前设置 range[0] 和 [1] 并从 2 开始循环可能更好,这样就不需要 if。

    【讨论】:

    • +1 表示从 2 开始循环,-1 表示样式推荐,其清晰程度显然是主观的。
    • 我什至在开始写作之前就考虑过从 2 开始循环,但是我如何才能使用limit=1 运行该函数?
    【解决方案3】:

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

    【讨论】:

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