当我运行代码时,指针损坏

主要

#include <iomanip>
#include <iostream>
#include "Bucket.h"
using namespace std;

int main()
{
    const int numberCount = 11;

    int startingNumbers[numberCount] = { 100, 79, 255, 355, 70, 85, 10, 5, 47, 62, 75 };

    cout << "Initial Numbers" << endl;
    for (int count = 0; count < numberCount; count++)
    {
        cout << startingNumbers[count] << " ";
    }
    cout << endl;


    bucketSort(startingNumbers, numberCount);

    system("pause");
}


值区

void bucketSort (int startingNumbers[], int numberCount);


Bucket.cpp

#include <iostream>
#include "Bucket.h"
using namespace std;


void bucketSort(int startingNumbers[], int numberCount)
{
    const int cols = 10;
    const int rows = 11;

    int row = 0;
    int input = 0;

    int *finger[cols];

    int table[rows][cols];

    for (int count = 0; count < numberCount; count++)
    {
        row = startingNumbers[count] % 10;
        table[row][count] = startingNumbers[count];

        finger[count] = &table[row][count];
    }

    for (int count = 0; count < numberCount; count++)
    {
        for (int col = 0; col < cols + 1; col++)
        {
            if (table[count][col] == *finger[col])
            {
                startingNumbers[input] = *finger[col];
                input++;
            }
        }
    }
    for (int count = 0; count < numberCount; count++)
    {
        cout << startingNumbers[count] << endl;
    }
}


直到最后,它都不会根据Visual Studio损坏,我使用的指针是否错误?

最佳答案

一个问题在这里:

    const int cols = 10;
    //...
    int *finger[cols];
    //...
    for (int count = 0; count < numberCount; count++)
    {
        row = startingNumbers[count] % 10;
        table[row][count] = startingNumbers[count];
        finger[count] = &table[row][count];  // <---- Issue Here
    }


您的finger数组被声明为具有cols个条目,但是使用finger进行的循环访问count将会超过cols值。换句话说,您以一定的大小声明了fingers数组,但是当您开始使用它进行处理时,就不会尊重fingers数组的边界。

解决方法是确保您永远不会超过fingers数组的末尾,或者如果要使fingers具有numberCount元素,然后使用std::vector

#include <vector>
//...
std::vector<int *> fingers(numberCount);


这样,代码将保持不变,并且不会崩溃。结果是否就是您想要的对数字进行排序的结果,这是另一回事了。但是,如果进行这些更改,您的代码将不会崩溃。

08-16 00:04