【问题标题】:Debug error: stack around the variable 'cardDesc' was corrupted调试错误:变量“cardDesc”周围的堆栈已损坏
【发布时间】:2023-04-06 08:24:02
【问题描述】:

标题。 我正在使用的功能是这样的:

void GetVideoCardInfo(int* memoryVar, char* cardName)
{
    strcpy_s(cardName, 128, m_videoCardDescription);
    *memoryVar = m_videoCardMemory;
    return;
}

m_videoCardDescription 是一个“128 个字符长”的字符数组,其中包含我的视频卡的描述。这是我调用函数的地方:

bool writeGPUnameDesc() {
    char cardDesc;
    int cardMem;
    m_D3D->GetVideoCardInfo(&cardMem, &cardDesc);

    std::ofstream myfile;
    myfile.open("gpuNameAndDesc.txt");
    myfile << "Graphics card name: " << cardDesc;
    myfile << " - Graphics card memory: " << cardMem;
    myfile.close();

    return true;
}

当我运行程序时,会弹出一个消息框,上面写着 Runtime-check failure #2 和标题。如果有人可以提供帮助,请提前致谢。

【问题讨论】:

  • cardDesc 只能容纳一个字符。你读了 128 个字符,你会过得很糟糕。
  • 有没有办法让它能够存储 128 个字符但仍可用作指针?
  • 怎么样char cardDesc[128]; ....
  • 你为什么在 C++ 中搞乱 C 风格的字符串? std::string 有什么问题?

标签: c++ pointers stack


【解决方案1】:

您将 128 个字符复制到 char cardDesc,这仅代表 1 个字符。

您应该将cardDesc 的类型更改为字符数组:

char cardDesc[128];
// ...
m_D3D->GetVideoCardInfo(&cardMem, cardDesc);
//                                ^ no &

【讨论】:

  • 空终止符去哪里了?
  • @user4581301 inside cardDesc,根据strcpy_s的文档
  • 不能争辩。我担心的是发起者 128 个字符加上终止符或 128 个包括终止符。可能正在删除一个字符。
【解决方案2】:

TL;DR

std::string GetVideoCardInfo(int & memoryVar)
{
    memoryVar = m_videoCardMemory;
    return m_videoCardDescription;;
}


bool writeGPUnameDesc() {
    int cardMem;
    std::string cardDesc = m_D3D->GetVideoCardInfo(cardMem); 

    std::ofstream myfile;
    myfile.open("gpuNameAndDesc.txt");
    myfile << "Graphics card name: " << cardDesc;
    myfile << " - Graphics card memory: " << cardMem;
    myfile.close();

    return true;
}

说明

strcpy_s(cardName, 128, m_videoCardDescription);

是一个明目张胆的谎言。 cardName 的大小正好是一个字符。如果你对strcpy_s 撒谎,它会额外检查以确保你没有超出缓冲区,这对你没有帮助。

劣质解决方案

替换

char cardDesc;   

char cardDesc[129]; 

更好的方法完全摆脱magic numbers

文件顶部附近

namespace // annonymous namespace. Contents will not leak out of the file
{
    constexpr int MAX_CARD_NAME_LENGTH = 129 // 128 plus room for nul terminator
}

然后

void GetVideoCardInfo(int* memoryVar, char* cardName)
{
    strcpy_s(cardName, MAX_CARD_NAME_LENGTH, m_videoCardDescription);
    *memoryVar = m_videoCardMemory;
    return;
}

bool writeGPUnameDesc() {
    char cardDesc[MAX_CARD_NAME_LENGTH]; // now an array
    int cardMem;
    m_D3D->GetVideoCardInfo(&cardMem, cardDesc); // don't need to take address of array

    std::ofstream myfile;
    myfile.open("gpuNameAndDesc.txt");
    myfile << "Graphics card name: " << cardDesc;
    myfile << " - Graphics card memory: " << cardMem;
    myfile.close();

    return true;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2021-03-28
    • 2012-11-08
    • 2019-09-04
    相关资源
    最近更新 更多