【问题标题】:C++ Stack around a variable is corrupted变量周围的 C++ 堆栈已损坏
【发布时间】:2012-11-08 04:31:21
【问题描述】:

我从我编写的代码中收到以下错误 - 运行时检查失败 #2 - 变量“pChar”周围的堆栈已损坏

从研究表明,问题与 pHexValueBuffer = new char[256] 和 memset 以及我如何使用名副其实的 - 存储值以返回十六进制数而不是十进制数有关。我的研究表明,不知何故,我已经超出了我设定的记忆的界限,只是不了解如何。

关于如何解决此问题的任何建议?

void DecToHex()
{
    string input;
    int total = 0;
    int index = 254;
    char pChar;
    char* pHexValueBuffer = new char[256];
    memset(pHexValueBuffer, 0, 256 );
    pHexValueBuffer[255] = '\0';

    cout << "Enter a Decimal Number\n\n" << flush;

    cin >> input;
    unsigned int iValue = atoi(input.c_str());


    do
    {
        --index;
        unsigned int iMod = iValue % 16;
        if( iMod > 9 )
        {
            switch (iMod)
            {
            case 10:
                pHexValueBuffer[index] = 'A';
                break;
            case 11:
                pHexValueBuffer[index] = 'B';
                break;
            case 12:
                pHexValueBuffer[index] = 'C';
                break;
            case 13:
                pHexValueBuffer[index] = 'D';
                break;
            case 14:
                pHexValueBuffer[index] = 'E';
                break;
            case 15:
                pHexValueBuffer[index] = 'F';
                break;
            default:
                break;
            }

        }
        else
        {
            itoa(iMod, &pChar, 10 );
            pHexValueBuffer[index] = pChar;
        }
        iValue = iValue/16;

    } while( iValue > 0 );

    cout << "Decimal Number = " << &pHexValueBuffer[index];
    delete []pHexValueBuffer;
    pHexValueBuffer = NULL;
}

【问题讨论】:

  • 一个非常简单的解决方法是使用边界检查迭代器而不是指针(例如,指向向量而不是数组)并查看它们在哪里给你错误。或者,如果您没有这些,请使用 vector::at。

标签: c++ memory-management stack runtime


【解决方案1】:

问题来了

char pChar;

itoa(iMod, &pChar, 10 );

itoa 可以处理一组字符而不是单个字符。

您可以找到如何使用itoahere 的示例。

另外,如果你还是要使用itoa,你可以避免使用整个DecToHex() 函数,只需调用itoa

int val;
char pHexValueBuffer[256]
cout << "Enter a Decimal Number\n\n" << flush;
cin >> val;
itoa(val, pHexValueBuffer, 16);
cout << "Hexadecimal Number = " << pHexValueBuffer;

你就完成了。

【讨论】:

  • DecToHex() 函数是因为该程序也用于转换为其他基数。它主要是将它们分开,所以我最终不会运行我没有测试的代码。例如,到目前为止,我已经编写了 binarytoDec() 和 dectobinary()。
  • itoa 也可以转换为其他基数 - 检查第三个参数。
  • ......哦哇......这......改变了我编写代码的方式,难怪老师说写这个应该只需要几个小时......(当前时间到目前为止大约 2 天以上)
  • 现在只是为了扭转这个过程。 :) 非常感谢 :)
【解决方案2】:

问题在于对 itoa 的调用

itoa(iMod, &pChar, 10 );

itoa 将在末尾放置一个空字符 - 因此您需要传递一个包含 2 个字符的数组。试试

char pChar[2];

...
itoa(iMod,pChar,10);

使用您的代码 itoa 调用最终会写入索引变量。

【讨论】:

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