首页 > 解决方案 > 运行时检查失败 #2 - 围绕变量堆栈

问题描述

我有下一个带有错误的代码 - “运行时检查失败 #2 - 变量‘操作’周围的堆栈已损坏。”

bool playerTurn(char board[][22], char boardcover[][22], int rows, int cols)
    
{
        char action[1];
        int row, col, count = 0;
    
        printf("please enter your move, row and column: ");
        scanf("%d%d", &row, &col);
        scanf("%s", action);
    
        if (action[0] == 'F') {
            boardcover[row][col] = 'F';
        }
    
        if (action[0] == 'O') {
            boardcover[row][col] = board[row][col];
            revealCell(board, boardcover, rows, cols, row, col);
        }

        return false;
    }

可能是什么问题?

我试图初始化“动作”并只扫描字符,但一切都不是正确的解决方案,我仍然有例外。

标签: cexceptionc-stringsruntimeexception

解决方案


“运行时检查失败 #2 - 围绕变量 'action' 的堆栈已损坏。” 通常发生在缓冲区溢出之后。

第一::char action[1]这个变量可以保存最大大小为 0 的字符串,是的,你读得很好。在 C 中,字符串是 NUL 终止的(详细信息在初学者的 C 教科书中处理字符串的章节中)。因此,如果您输入任何长度超过 0 个字符的字符串,action缓冲区就会溢出,因此会出现错误消息。

第二:scanf("%s", action)没有检查缓冲区大小,所以如果你声明char action[10],并且你输入一个长度超过 9 个字符的字符串(问:为什么是 9 而不是 10?答:记住 NUL 终止符)你会得到一个缓冲区溢出。

所以你应该做的是使用scanf("%9s", action)它将输入的字符串的大小限制为9个字符。


但实际上,当您只想输入一个字符时,您可以简单地使用 char 而不是字符串:

char action;           // declare one single char
...
scanf("%c", &action);  // use %c instead of %s
...

推荐阅读