【问题标题】:Run-Time Check Failure #2 - Stack around variable运行时检查失败 #2 - 围绕变量堆栈
【发布时间】:2021-04-03 05:19:41
【问题描述】:

我的下一个代码出现错误 -“运行时检查失败 #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;
    }

可能是什么问题?

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

【问题讨论】:

  • char action[1]; 数组不足以容纳输入字符 (必需的)nul 终止符。需要(至少)char action[2];
  • 你好。你能告诉我makefile 标志来打开运行时检查吗?我丢失了我的makefile 配置。谢谢。

标签: c exception c-strings runtimeexception


【解决方案1】:

“运行时检查失败 #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
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 2013-12-13
    • 2013-12-10
    • 2015-02-09
    • 2015-05-24
    相关资源
    最近更新 更多