变量周围的堆栈"variable name"已损坏C++
stack around the variable "variable name" was corrupted C++
我有一段代码,应该是大学里一个项目的mips处理器的汇编程序
现在我的问题是,当执行程序时,一切都很顺利,直到程序退出主程序,它会抛出这个错误:
变量CCD_ 1周围的堆栈已损坏。
这个错误是在退出main时抛出的,我在任何地方都找不到有效的解决方案。
下面是我的代码示例:
#include <iostream>
#include <fstream>
#include <string>
#include <bitset>
using namespace std;
//function to convert string to binary
bool tobool(char x)
{
if (x == '0')
return 0;
else
return 1;
}
//function to decode the register name into an address using call by refrence to modify the instruction boolean encoding array
void register_encode(string Register, bool &address2, bool &address3, bool &address4, bool &address5, bool &address6)
{
if (Register == "$zero")
{
address2 = 0; address3 = 0; address4 = 0; address5 = 0; address6 = 0;
}
else if (Register == "$t3")
{
address2 = 0; address3 = 1; address4 = 0; address5 = 1; address6 = 1;
}
else if (Register == "$s2")
{
address2 = 1; address3 = 0; address4 = 0; address5 = 1; address6 = 0;
}
}
//function to count the number of occurence of commas (,) inside the string
int count_commas(string s) {
int count = 0;
for (int i = 0; i < s.size(); i++)
if (s[i] == ',') count++;
return count;
}
void main()
{
int numberofinstruction = 0;
string testingstring;
string line[64];
ifstream myfile;
myfile.open("test.txt");
// taking input from file into an array "line" which holds every single line inside the array in a single element inside the array
while (getline(myfile, testingstring))
{
line[numberofinstruction] = testingstring;
numberofinstruction++;
}
myfile.close();
//transform to binary
bool binaryinstruction[31];
string firstterm, secondterm, thirdterm, fourthterm;
for (int counter = 0; counter<numberofinstruction; counter++)
{
switch (count_commas(line[counter])) {
case 1:
firstterm = line[counter].substr(0, line[counter].find(" "));
secondterm = line[counter].substr(line[counter].find(" ") + 1, line[counter].find(",") - line[counter].find(" ") - 1);
thirdterm = line[counter].substr(line[counter].find(",") + 1, line[counter].size() - line[counter].find(","));
if (firstterm == "lw")
{ //LW encoding
binaryinstruction[0] = 1;
binaryinstruction[1] = 0;
binaryinstruction[2] = 0;
binaryinstruction[3] = 0;
binaryinstruction[4] = 1;
binaryinstruction[5] = 1;
register_encode(secondterm, binaryinstruction[11], binaryinstruction[12], binaryinstruction[13], binaryinstruction[14], binaryinstruction[15]);
string offset = thirdterm.substr(0, thirdterm.find('('));
offset = bitset<16>(stoi(offset)).to_string();
for (int x = 0; x <= 15; x++)
{
binaryinstruction[16 + x] = tobool(offset[x]);
}
string lwregister = thirdterm.substr(thirdterm.find('$'), thirdterm.size() - thirdterm.find('(') - 2);
register_encode(lwregister, binaryinstruction[6], binaryinstruction[7], binaryinstruction[8], binaryinstruction[9], binaryinstruction[10]);
}
else
{ //SW encoding
binaryinstruction[0] = 1;
binaryinstruction[1] = 0;
binaryinstruction[2] = 1;
binaryinstruction[3] = 0;
binaryinstruction[4] = 1;
binaryinstruction[5] = 1;
//begin
register_encode(secondterm, binaryinstruction[11], binaryinstruction[12], binaryinstruction[13], binaryinstruction[14], binaryinstruction[15]);
string offset = thirdterm.substr(0, thirdterm.find('('));
offset = bitset<16>(stoi(offset)).to_string();
for (int x = 0; x <= 15; x++)
{
binaryinstruction[16 + x] = tobool(offset[x]);
}
string lwregister = thirdterm.substr(thirdterm.find('$'), thirdterm.size() - thirdterm.find('(') - 2);
register_encode(lwregister, binaryinstruction[6], binaryinstruction[7], binaryinstruction[8], binaryinstruction[9], binaryinstruction[10]);
//end
}
break;
}
}
//testing
ofstream myfile2("testout.txt");
for (int f = 0; f <= 31; f = f + 8)
{
myfile2 << binaryinstruction[f] << binaryinstruction[f + 1] << binaryinstruction[f + 2] << binaryinstruction[f + 3] << binaryinstruction[f + 4] << binaryinstruction[f + 5] << binaryinstruction[f + 6] << binaryinstruction[f + 7] << endl;
}
//end testing
}
在测试文件中,我有一行是lw $t3,4($s2)
,要在测试文件内写入的输出是:
10001110
01001011
00000000
00000100
我的问题是访问不存在的数组的索引我忘了在C++中识别数组时,键入数组中元素的数量,而不是数组的最后一个索引。让我感到困惑的是抛出错误的地方,当使用断点进行调试时,它会在退出void main()
时抛出异常,而不是在访问未识别的数组元素时抛出异常。
与大多数其他高级语言不同,C++不一定执行数组索引检查。因此,索引错误会导致未定义的行为。在您的情况下,这会在退出时产生一条消息,但这种类型的错误通常会完全未报告。
不过,有一些解决方案,特别是使用更现代的数组类型容器,如std::array
和std::vector
。出于速度优化的原因,这些也不在默认操作模式下执行索引检查,但是有一些方法可以启用它。请参阅我的答案。
这不是一个答案,但不能放入注释中
我们开始。。。
bool tobool(char x)
{
if (x == '0')
return 0;
else
return 1;
应该是
bool tobool(char x)
{
return x == '0'? false : true;
}
然后
void register_encode(string Register, bool &address2, bool &address3, bool &address4, bool &address5, bool &address6)
{
应该是
void register_encode(const std::string& Register, bool &address2, bool &address3, bool &address4, bool &address5, bool &address6)
{
同上,带
count_commas
我确信std::string
中有一种方法可以实现
还有
void main()
应该是
int main()
相关文章:
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 为什么C中的通用链表中存储的数据已损坏
- gdb错误:Backtrace已停止:上一帧与此帧相同(堆栈已损坏?)
- 变量周围的堆栈'...'已损坏
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- 两个垫子的 OpenCV 数据是相同的,但使用 Mat::at 检索时的值已损坏
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 变量周围的堆栈'sortArray'已损坏
- 变量周围的堆栈'folderPath'已损坏
- 在为 iOS 构建 aws-sdk-cpp 时,cmake 上的 CXX 编译器错误已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- AES-128 CFB-8解密的前16个字节已损坏
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 图像在本地主机上显示已损坏
- 检查工作正常的 CXX 编译器:/cygdrive/c/cygwin64/bin/clang++ -- 已损坏
- 数组变量周围的堆栈已损坏
- 运行时检查失败 - 变量周围的堆栈已损坏
- 变量"name"周围的堆栈已损坏C++
- 变量周围的堆栈"variable name"已损坏C++