访问冲突读取位置 C++
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18648440/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
access violation reading location c++
提问by user2752676
I'm writing a program that print the full english name of the number inputted by the user. it's not a complete program but i keep getting an error:
我正在编写一个程序来打印用户输入的数字的完整英文名称。这不是一个完整的程序,但我不断收到错误消息:
First-chance exception at 0x00b02c76 in Programming Challenge 14.1.exe: 0xC0000005: Access violation reading location 0xcccccd80. Unhandled exception at 0x00b02c76 in Programming Challenge 14.1.exe: 0xC0000005: Access violation reading location 0xcccccd80.
Programming Challenge 14.1.exe 中 0x00b02c76 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xcccccd80。编程挑战 14.1.exe 中 0x00b02c76 处未处理的异常:0xC0000005:访问冲突读取位置 0xcccccd80。
I've tried looking around and couldn't find anything of use to me. here this the program:
我试过环顾四周,找不到任何对我有用的东西。这是程序:
header file:
头文件:
#ifndef NUMBERS_H
#define NUMBERS_H
#include <string>
using namespace std;
const int SIZE1 = 18;
const int SIZE2 = 8;
class Numbers
{
private:
int number;
string hundred;
string thousand;
string * one;
string * ten;
public:
Numbers(int num)
{
number = num;
hundred = "hundred";
thousand = "thousand";
string * one = new string[SIZE1];
string * ten = new string[SIZE2];
}
void initializeArray()
{
// Intialize array "one"
one[0] = "zero";
one[1] = "one";
one[2] = "two";
one[3] = "three";
one[4] = "four";
one[5] = "five";
one[6] = "six";
one[7] = "seven";
one[8] = "eight";
one[9] = "nine";
one[10] = "eleven";
one[11] = "twelve";
one[12] = "thirteen";
one[13] = "fourteen";
one[14] = "fifteen";
one[15] = "sixteen";
one[16] = "seventeen";
one[17] = "eighteen";
one[18] = "nineteen";
// Initialize the ten array
ten[0] = "ten";
ten[1] = "twenty";
ten[2] = "thirty";
ten[3] = "forty";
ten[4] = "fifty";
ten[5] = "sixty";
ten[6] = "seventy";
ten[7] = "eighty";
ten[8] = "ninety";
}
string determine()
{
string name = "";
for (int i = 0; i <= number; i++)
{
if (number == i)
{
name = one[i];
}
}
return name;
}
~Numbers()
{
delete [] one;
delete [] ten;
}
};
#endif
and this is the main program, im just using a constructor to assign a value to number to make debugging a little faster
这是主程序,我只是使用构造函数为 number 赋值以加快调试速度
#include <iostream>
#include "Numbers.h"
using namespace std;
int main()
{
Numbers n(5);
string name = n.determine();
cout << "The number is " << name << endl;
cin.ignore();
cin.get();
return 0;
}
by the way this is vc++ for the compiler
顺便说一句,这是编译器的 vc++
ill answer any questions as this isnt really too organized
我不会回答任何问题,因为这不是太有组织
采纳答案by user1567453
Two things here:
这里有两件事:
You are not calling "initializeArray()" at all. So when you are trying to access the array there is nothing there. I would recommend calling it in the constructor. Like this:
您根本没有在调用“initializeArray()”。因此,当您尝试访问数组时,那里什么也没有。我建议在构造函数中调用它。像这样:
Numbers(int num)
{
number = num;
hundred = "hundred";
thousand = "thousand";
one = new string[SIZE1];
ten = new string[SIZE2];
initializeArray();
}
Second, is what the guys above said. You have an incorrect value for the size of your array since you are trying to assign 19 values to an array of size 18. Just to be really sure lets make the size bigger than we expect and you can adjust later:
其次,就是上面几位说的。由于您试图将 19 个值分配给大小为 18 的数组,因此您的数组大小值不正确。只是为了确保让大小大于我们的预期,您可以稍后进行调整:
const int SIZE1 = 20;
const int SIZE2 = 20;
Additionally, See your determine()? instead of using a for loop why don't you go:
另外,看到你的确定()?而不是使用 for 循环为什么不去:
string name = one[number];
EDIT: Wow there was another thing I missed...you have declared your array pointer variable twice and so it's actually going out of scope thinking you want to make some local versions. Look at my adjusted implementation of your constructor above again. See how I've removed the "String *" from before the variable names.
编辑:哇,我错过了另一件事......你已经两次声明了你的数组指针变量,所以它实际上超出了范围,认为你想要制作一些本地版本。再看看我上面对构造函数的调整实现。看看我是如何从变量名之前删除“String *”的。
回答by Mahesh
const int SIZE1 = 18;
Valid array index for the array of SIZE1
are 0 to 17. In general, valid indexes for an array of size Nare 0to N-1.
为阵列有效数组索引SIZE1
是0至17一般情况下,有效的索引的大小的阵列Ñ是0到N-1 。
I recommend using std::vector<std::string>
.
我建议使用std::vector<std::string>
.
回答by David Schwartz
one
holds 18 elements, but you put 19 elements in there.
one
有 18 个元素,但你在里面放了 19 个元素。
回答by Testing
The variable "one" and "ten" have been changed from string pointers to vectors holding strings. Called the initializeArray within the constructor. Changed the way the name string was being assigned the new string. Here is the working code.
变量“一”和“十”已从字符串指针更改为包含字符串的向量。在构造函数中调用 initializeArray。更改了为名称字符串分配新字符串的方式。这是工作代码。
class Numbers
{
private:
int number;
string hundred;
string thousand;
vector<string> one;
vector<string> ten;
public:
Numbers(int num)
{
number = num;
hundred = "hundred";
thousand = "thousand";
initializeArray();
}
void initializeArray()
{
one.push_back("zero");
one.push_back("one");
one.push_back( "two");
one.push_back("three");
one.push_back("four");
one.push_back("five");
one.push_back("six");
one.push_back("seven");
one.push_back("eight");
one.push_back("nine");
one.push_back("eleven");
one.push_back("twelve");
one.push_back("thirteen");
one.push_back("fourteen");
one.push_back("fifteen");
one.push_back("sixteen");
one.push_back("seventeen");
one.push_back("eighteen");
one.push_back("nineteen");
// Initialize the ten array
ten.push_back("ten");
ten.push_back("twenty");
ten.push_back("thirty");
ten.push_back("forty");
ten.push_back("fifty");
ten.push_back("sixty");
ten.push_back("seventy");
ten.push_back("eighty");
ten.push_back("ninety");
}
string determine()
{
string name("");
for (int i = 0; i <= number; i++)
{
if (number == i)
{
auto iter = one.begin();
iter += i;
name.assign(*iter);
}
}
return name;
}
~Numbers()
{
}
};
int main()
{
Numbers n(5);
string name = n.determine();
cout << "The number is " << name << endl;
cin.ignore();
cin.get();
return 0;
}