realloc(): invalid next size求助

Yukkkki 2018-01-29 11:36:05
在leetcode上用c语言写NQueens问题,在用三维数组保存解的时候使用realloc函数分配内存,当我n=4的时候执行结果正确,n=8的时候就报错realloc(): invalid next size,查了一下好多都说是realloc新空间比原空间小的问题,可是我已经设置了数组的容量大小并对其进行判断了。代码如下:

#define FALSE -1
#define TRUE 1

static int sum = 0; //结果个数
static int capacity = 2; //array数组初始容量

/*将结果保存在array中*/
void output(char ***array, int *a, int n)
{
    int i, j;
    sum += 1;
    
    /*当容量小于结果个数时,扩容*/
    if(sum > capacity)
    {
        capacity = capacity * 2;
        array = (char ***)realloc(array, sizeof(char **) * capacity);
        if(array == NULL)
        {
            printf("array is NULL");
            exit(0);
        }
    }

    /*为每个解分配空间保存摆放位置*/
    array[sum-1] = (char **)malloc(sizeof(char *) * n);
    for(i = 0; i < n; i++)
    {
        array[sum-1][i] = (char *)malloc(sizeof(char) * (n + 1));
        array[sum-1][i][n] = '\0';
        for(j = 0; j < n; j++)
        {
            if(a[i] == j)
                array[sum-1][i][j] = 'Q';
            else
                array[sum-1][i][j] = '.';
        }
    }
}

/*检测摆放位置有效性*/
int check(int n, int *a)
{
    int i;
    for(i = 0; i < n; i++)
    {
        if((abs(n-i) == abs(a[n]-a[i]) || a[n] == a[i]))
           return FALSE;
    }
    return TRUE;
}

/*递归解决问题*/
void NQueens(int t, int n, char ***array, int *a)
{
    int i;
    if(t == n)
        output(array, a, n);
    else
    {
        for(i = 0; i < n; i++)
        {
            a[t] = i;
            if(check(t, a))
                NQueens(t+1, n, array, a);
        }
    }
}

/*初始化并执行NQueens函数,其中一维数组a模拟n×n棋盘*/
char*** solveNQueens(int n, int* returnSize) {
    int i;
    *returnSize = 0;
    char ***answer = (char ***)malloc(sizeof(char **) * 2);

    if(n <= 0)
    {
        return answer;
    }

    int *a = (int *)malloc(sizeof(int) * n);

    for(i = 0; i < n; i++)
    {
        a[i] = -1;
    }

    NQueens(0, n, answer, a);
    *returnSize = sum;
    return answer;
}

valgrind:





显示array为NULL,可是我的程序里判断array是否为空的printf语句并没有输出
...全文
697 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
三字二十五画 2018-02-03
  • 打赏
  • 举报
回复
直接把sizeof(char **)改成4
三字二十五画 2018-02-03
  • 打赏
  • 举报
回复
sizeof前面加个(unsigned)试试
自信男孩 2018-01-29
  • 打赏
  • 举报
回复
array = (char ***)realloc(array, sizeof(char **) * capacity);
这个扩容有问题吧,大小没变化呢,是不是应该是:
array = (char ***)realloc(array, sizeof(char **) * sum);
paschen 2018-01-29
  • 打赏
  • 举报
回复
单步跟踪程序运行,观察变量变化情况,分析原因

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧