【问题标题】:Double free or corruption (!prev) error in CC 中的双重释放或损坏 (!prev) 错误
【发布时间】:2016-07-09 05:58:20
【问题描述】:

我在在线法官上执行以下功能时遇到双重释放或损坏 (!prev) 错误。

void nextPermutation(int* A, int n1) 
{
    int i    = 0;
    int tmp  = 0;
    int flag = 0;
    int ret  = 0;

    if(n1 == 1)
        return A[0];

    for(i = n1; i > 0; i--)
    {
        if(flag == 0)
        {
            if(A[i] > A[i - 1])
            {
                tmp      = A[i];
                A[i]     = A[i - 1];
                A[i - 1] = tmp;
                flag     = 1;
                ret      = i;
                break;
            }
        }
    }

    for(i = ret; i < n1 - 1; i++)
    {
        if(A[i] > A[i + 1])
            tmp = A[i];

        A[i]     = A[i + 1];
        A[i + 1] = tmp;
    }
}

但是,当我使用自定义输入测试代码时,它可以正常工作。 谁能告诉我为什么会这样?

【问题讨论】:

  • 您的函数的返回类型为 void,并且您在第一个 if 条件下返回 A[0]。
  • 在第二个for 循环中,所有三个分配都应该是if 的一部分吗?由于您没有使用大括号,因此if 中只有第一行。
  • 你能把你打电话的代码贴出来吗?
  • 你从不使用标志,我的意思是你使用它,但是一旦你设置它,你就会跳出循环。那么flag有什么意义呢?

标签: c


【解决方案1】:

这段代码中 int* A 的大小是多少。我认为在第一个 for 循环中,您需要使用 (n1-1) 初始化 i。

for(i=(n1-1);i>0;i--)

i>0 的条件似乎很好,因为正在循环评估 A[i-1]。

我认为您需要使用 malloc 将内存分配给 int*。另外,正如我在上面的评论中所说,您不能返回 A[0];

【讨论】:

    猜你喜欢
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多