初始化程序正在覆盖第二个数组

Initializer is overwriting second array

本文关键字:第二个 数组 覆盖 程序 初始化      更新时间:2023-10-16

我无法解决这个问题,我几乎接受了这样一个事实,即目前我的机器可能存在内存问题。

我有一个初始化器:

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

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

希望你能帮忙。

没有其他事情发生,只有初始化器在这一点上被调用。

问题是,如果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;
    }

也就是说,在填充完SearchDataFirst之后,在开始填充SearchDataLast之前,需要将i重置回零。

您的逻辑没有任何意义。据我所知,你正试图做这样的事情:

} else if(i >= SEARCH_DATA_SIZE) {
    SearchDataLast[i - SEARCH_DATA_SIZE] = id;
    SearchDataLastSorted[i - SEARCH_DATA_SIZE] = id;
}

在其当前形式中,您试图在SearchDataLastSearchDataLastSorted中写入的每个元素都超出了数组边界(这确实会导致内存损坏(。

您的问题在这里:

    else if(i >= SEARCH_DATA_SIZE) {
        SearchDataLast[i] = id;
        SearchDataLastSorted[i] = id;
    }

您将超过SearchDataLastSearchDataLastSorted的边界,因为它们的大小为SEARCH_DATA_SIZE,并且i大于或等于该量。您可能想要的是i - SEARCH_DATA_SIZE作为索引。

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

您不能确保不会溢出SearchDataLastSearchDataLastSorted数组。

i超过SEARCH_DATA_SIZE时,切换阵列。。。但是继续从大于CCD_ 22数组的CCD_。

大概,你打算写这样的东西:

    else if (i >= SEARCH_DATA_SIZE)
    {
        SearchDataLast[i-SEARCH_DATA_SIZE] = id;
        SearchDataLastSorted[i-SEARCH_DATA_SIZE] = id;
    }

您仍然需要确保不会溢出这些数组的末尾(通过确保i不是2 * SEARCH_DATA_SIZE或更大(。