Initializer正在覆盖第二个数组

时间:2011-12-04 05:21:34

标签: c++

我无法解决这个问题,我几乎已经接受这样一个事实:此时我的机器可能存在内存问题。

我有这个初始化程序:

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很好。

我从未对编程语言感到沮丧。

希望你能提供帮助。

没有其他事情发生,此时只调用初始值设定项。

4 个答案:

答案 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;
}

以其当前形式尝试在SearchDataLastSearchDataLastSorted中写入的每个元素超出数组范围(这确实会导致内存损坏)。

答案 2 :(得分:0)

你的问题在这里:

    else if(i >= SEARCH_DATA_SIZE) {

        SearchDataLast[i] = id;
        SearchDataLastSorted[i] = id;

    }

您已超越SearchDataLastSearchDataLastSorted的范围,因为它们的大小为SEARCH_DATA_SIZEi大于或等于该金额。你可能想要的是i - SEARCH_DATA_SIZE作为索引。

因此你会导致未定义的行为,在这种情况下,编译器按顺序为每个数组分配了内存。因此,您基本上是在SEARCH_DATA_SIZE中跳过SearchDataLast元素,并在SearchDataFirstSorted中存储您想要的值。

答案 3 :(得分:0)

您无法确保不会超出SearchDataLastSearchDataLastSorted数组。

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或更大。