【问题标题】:Why is my code throwing a C6386 error when trying to copy a character array?为什么我的代码在尝试复制字符数组时会引发 C6386 错误?
【发布时间】:2020-01-14 03:01:58
【问题描述】:

我在以下代码中收到 C++ 警告 C6386:

int m_wordNumber = getRandomNumber();
//get word size
size_t m_wordSize = strlen(m_wordsArray[m_wordNumber]);
//create word arrays
char* m_chosenWord = new char[m_wordSize];
char* m_blankArray = new char[m_wordSize];

int m_incorrectGuessCounter = 0;

generateArray(m_blankArray, m_wordSize);
//copy word to new array
strcpy_s(m_chosenWord, m_wordSize + 1, m_wordsArray[m_wordNumber]);
//create temp array and output word
char * m_tempWordHolder = nullptr;
std::cout << m_chosenWord << std::endl;

引发警告的行是 strcpy_s 行,它所做的只是将字符串从字符数组复制到不同的字符数组。

任何帮助将不胜感激,谢谢。

警告如下:

警告 C6386 写入“m_chosenWord”时缓冲区溢出:可写大小为“m_wordSize*1”字节,但可能写入“7”字节

【问题讨论】:

  • 什么是 C6386 ?请在问题中包含错误消息。错误代码是编译器特定的,错误本身不是。不是每个人都使用视觉工作室
  • 是警告还是错误?请提供minimal reproducible example 和错误信息
  • 有什么理由不使用std::string
  • char m_chosenWord = new char[m_wordSize]; 你没有为空终止符留出空间
  • 重要提示:strlen 不计算空终止符。您基于m_wordSize 创建的数组将是一个字符太短。

标签: c++ visual-studio-2019


【解决方案1】:

分配m_chosenWord 时,分配m_wordSize 字符。然而,在

strcpy_s(m_chosenWord, m_wordSize + 1, m_wordsArray[m_wordNumber]);

您正在编写m_wordSize + 1 个字符。在初始分配中,您还想添加+1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多