我无法解决这个问题,我几乎已经接受这样一个事实:此时我的机器可能存在内存问题。
我有这个初始化程序:
Search::Search(ifstream& inFile)
{
int id = 0;
int i = 0;
inFile >> id;
while (inFile) {
if(i < SEARCH_DATA_SIZE) {
SearchDataFirst[i] = id;
SearchDataFirstSorted[i] = id;
} else if(i >= SEARCH_DATA_SIZE) {
SearchDataLast[i] = id;
SearchDataLastSorted[i] = id;
}
i++;
inFile >> id;
}
}
在我的标题中,我有私有数据,如下:
const int SEARCH_DATA_SIZE = 20;
int SearchDataFirst[SEARCH_DATA_SIZE]; int SearchDataLast[SEARCH_DATA_SIZE]; int SearchDataFirstSorted[SEARCH_DATA_SIZE]; int SearchDataLastSorted[SEARCH_DATA_SIZE];
初始化程序从inFile获取前20个int,存储它们,然后转到下一个记录并将它们存储在单独的数组中,
当我打印数组时,SearchDataFirstSorted具有SearchDataLast的值,即使没有可能发生这种情况。 SearchDataLastSorted有奇怪的时髦数字。
SearchedDataFirst很好。
我从未对编程语言感到沮丧。
希望你能提供帮助。
没有其他事情发生,此时只调用初始值设定项。
答案 0 :(得分:1)
问题是如果i >= SEARCH_DATA_SIZE
,则SearchDataLast[i]
指向SearchDataLast
之外!你真正需要的是这样的:
for(int i = 0; i < SEARCH_DATA_SIZE; ++i)
{
inFile >> id;
SearchDataFirst[i] = id;
SearchDataFirstSorted[i] = id;
}
for(int i = 0; i < SEARCH_DATA_SIZE; ++i)
{
inFile >> id;
SearchDataLast[i] = id;
SearchDataLastSorted[i] = id;
}
也就是说,在完成填充i
之后以及开始填充SearchDataFirst
之前,您需要将SearchDataLast
重置为零。
答案 1 :(得分:0)
你的逻辑没有任何意义。我能想到的最好的,你正试图做这样的事情:
} else if(i >= SEARCH_DATA_SIZE) {
SearchDataLast[i - SEARCH_DATA_SIZE] = id;
SearchDataLastSorted[i - SEARCH_DATA_SIZE] = id;
}
以其当前形式尝试在SearchDataLast
和SearchDataLastSorted
中写入的每个元素超出数组范围(这确实会导致内存损坏)。
答案 2 :(得分:0)
你的问题在这里:
else if(i >= SEARCH_DATA_SIZE) {
SearchDataLast[i] = id;
SearchDataLastSorted[i] = id;
}
您已超越SearchDataLast
和SearchDataLastSorted
的范围,因为它们的大小为SEARCH_DATA_SIZE
且i
大于或等于该金额。你可能想要的是i - SEARCH_DATA_SIZE
作为索引。
因此你会导致未定义的行为,在这种情况下,编译器按顺序为每个数组分配了内存。因此,您基本上是在SEARCH_DATA_SIZE
中跳过SearchDataLast
元素,并在SearchDataFirstSorted
中存储您想要的值。
答案 3 :(得分:0)
您无法确保不会超出SearchDataLast
和SearchDataLastSorted
数组。
当i
超出SEARCH_DATA_SIZE
时,您切换数组,......但是......您继续从大于SEARCH_DATA_SIZE
数组的SearchDataLast
建立索引。< / p>
据推测,你打算写一些类似的东西:
else if (i >= SEARCH_DATA_SIZE)
{
SearchDataLast[i-SEARCH_DATA_SIZE] = id;
SearchDataLastSorted[i-SEARCH_DATA_SIZE] = id;
}
您仍然需要确保不会溢出这些数组的末尾(确保i
不是2 * SEARCH_DATA_SIZE
或更大。