运行时检查失败 #2 - 围绕变量堆栈

问题描述

我有一个错误代码 -“运行时检查失败 #2 - 变量'action'周围的堆栈已损坏。”

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;
    }

可能是什么问题?

我尝试初始化“动作”并仅扫描字符,但一切都不是正确的解决方案,我仍然遇到异常。

解决方法

“运行时检查失败 #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 action;           // declare one single char
...
scanf("%c",&action);  // use %c instead of %s
...