C语言 力扣51题 N皇后问题 报错堆缓冲区溢出 VS却能成功运行

力扣第51题 N皇后
输入为7的时候显示堆溢出
输入为6的时候运行正常
且在VS运行都没有报错
col数组尝试过开大过 此题代码是力扣第52题 N皇后字母题代码改的(52题只要求输出解法个数,51题要求输出每种解法的棋盘摆法)

img


int col[10];//表示第i行的皇后放在第col[i]列上,即皇后坐标为(i,col[i]);
int count=0;
int boardSize=0;
char *** boards=NULL;
bool check(int x,int y){//默认每行只放一个 故不检查行
    for(int i=1;i<=x;i++){
        if(col[i]==y)//检测前面的每行是否有放在当前列上的皇后
        return false;
        if(i+col[i]==x+y)//检测前面每行是否有放在当前皇后对角线上的皇后
        return false;
        if(i-col[i]==x-y)
        return false;
    }
    return true;
}
void fillBoard(int *data){
    //构造棋盘
    boards=(char ***)realloc(boards,sizeof(char**)*count);
    boards[count-1]=(char**)malloc(sizeof(char*)*boardSize);
    for(int i=0;i-1][i]=(char*)calloc(boardSize+1,sizeof(char));
        memset(boards[count-1][i],'.',boardSize);//初始化棋盘
    }
    //写入皇后
    for(int i=1;i<=boardSize;i++){
        boards[count-1][i-1][data[i]-1]='Q';
    }
}
void dfs(int row){
    if(row==boardSize+1){
        count++;
        fillBoard(col);
        return;
    }
    for(int i=1;i<=boardSize;i++){
        if(check(row,i)==true){
            col[row]=i;
            dfs(row+1);
            col[row]=0;//归零 无论找到找不到都要归零 不然后面再找的时候会出错
        }
    }
}

char *** solveNQueens(int n, int* returnSize, int** returnColumnSizes){
    memset(col,0,4*10);
    count=0;
    boardSize=n;
    boards=NULL;
    dfs(1);
    *returnSize=count;
    *returnColumnSizes = malloc(sizeof(int*) * boardSize);
    for(int i=0;ireturn boards;
}

上为我的代码
当输入为6的时候,还是能顺利跑过 当输入为7的时候就会报错

img


上为报错内容

img


输入6 成功跑过
力扣51题是52题的子母题 我在52题的基础上添加了fillBoard函数 其他函数运行52题的时候AC
在VS运行的时候页也可以跑 并且答案是对的

#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
#include
#include
int col[10];//表示第i行的皇后放在第col[i]列上,即皇后坐标为(i,col[i]);
int count = 0;
int boardSize = 0;
char*** boards = NULL;
void prind(char** board) {
    for (int i = 0;i < boardSize;i++) {
        printf("%s\n", board[i]);
    }
    printf("\n");
}
bool check(int x, int y) {//默认每行只放一个 故不检查行
    for (int i = 1;i <= x;i++) {
        if (col[i] == y)//检测前面的每行是否有放在当前列上的皇后
            return false;
        if (i + col[i] == x + y)//检测前面每行是否有放在当前皇后对角线上的皇后
            return false;
        if (i - col[i] == x - y)
            return false;
    }
    return true;
}
void fillBoard(int* data) {
    //构造棋盘
    boards = (char***)realloc(boards, sizeof(char**) * count);
    boards[count - 1] = (char**)malloc(sizeof(char*) * boardSize);
    for (int i = 0;i < boardSize;i++) {
        boards[count - 1][i] = (char*)calloc(boardSize + 1, sizeof(char));
        memset(boards[count - 1][i], '.', boardSize);//初始化棋盘
        boards[count - 1][i][boardSize] = '\0';
    }
    //写入皇后
    for (int i = 1;i <= boardSize;i++) {
        boards[count - 1][i - 1][data[i] - 1] = 'Q';
    }
    //prind(boards[count - 1]);

}
void dfs(int row) {
    if (row == boardSize + 1) {
        count++;
        fillBoard(col);
        return;
    }
    for (int i = 1;i <= boardSize;i++) {
        if (check(row, i) == true) {
            col[row] = i;
            dfs(row + 1);
            col[row] = 0;//归零 无论找到找不到都要归零 不然后面再找的时候会出错
        }
    }
}
char*** solveNQueens(int n, int* returnSize) {
    memset(col, 0, 4 * 10);
    count = 0;
    boardSize = n;
    boards = NULL;
    dfs(1, boards);
    *returnSize = count;
    /**returnColumnSizes = malloc(sizeof(int*) * boardSize);
    for (int i = 0;i < count;i++) {
        (*returnColumnSizes)[i] = boardSize;
    }*/
    for (int i = 0;i < count;i++) {
        prind(boards[i]);
    }
    return boards;
}
int main() {
    int resultssize = 0;
    char*** results = solveNQueens(7, &resultssize);
    return 0;
}

上为VS代码

img


此为VS运行结果 与答案一致
百思不得其解

我尝试改一下代码,等会给你。

提供参考实例
【【算法】【回溯】N皇后问题【力扣-51】超详细的注释和解释手撕N皇后】,链接:https://blog.csdn.net/Yu_Cblog/article/details/122961270
【C语言 缓冲区溢出 详解C语言之缓冲区溢出】,链接:http://www.qb5200.com/article/397614.html

力扣(51困难) N皇后问题
借鉴下
https://blog.csdn.net/LCB2018/article/details/127021288

错误原因

*returnColumnSizes = malloc(sizeof(int*) * boardSize);

此处应该为
returnColumnSizes = malloc(sizeof(int) * count);
并不棋盘大小
会造成声明的空间不够
而VS版的代码我把那个地方注释掉了 故不会出错