0

私の週末の課題は、整数の配列と配列のサイズを取得し、ポインターの配列を作成して、ポインターがバブルソートを使用して (元の配列を変更せずに) ソートされるようにする関数を作成することでした。

デバッグ中に問題なく動作することがわかりましたが、関数が main() に戻ると、ポインター配列が初期化され、すべてがなくなりました。

#include <iostream>
using namespace std;

void pointerSort(int arr[], int size, int* pointers[]);
void swap(int a, int b);
void main()
{
    int arr[5]={7,2,5,9,4};
    int size = 5;
    int* pointers[5];

    pointerSort(arr, size, pointers);

    for (int i = 0; i < 5 ; i++)
        cout << *pointers[i] << endl;
}
void pointerSort(int arr[], int size, int* pointers[])
{
    int j, i;
    bool change = true;

    pointers = new int*[size];
    for (i = 0; i < size; i++)
        pointers[i] = &arr[i];

    i = 0;
    j = 1;
    while (i <= size-1 && change == true)
    {
        change = false;
        for (i = 0; i < size-j; i++)
        {
            if (*pointers[i] > *pointers[i+1])
            {
                swap(pointers[i], pointers[i+1]);
                change = true;
            }
        }
        j++;
    }
}
void swap(int&a, int&b)
{
    int temp;

    temp = a;
    a = b;
    b = temp;
}
4

1 に答える 1

3
pointers = new int*[size];

この時点pointersですでにポインターの配列になっているため、割り当ては必要ありません。

この行の後は、pointers 主な機能の配列ではなくなりました。

pointersこれが、指している配列を再割り当てしているため、関数が失敗している理由です。元の配列 ISNT は再初期化され、コード全体で無視されます。

割り当てられたスペースを削除せず、関数の終了後にスペースを削除できないため、ATaylor が言及しているようにメモリ リークでもあります。

すべてを修正するには、上記の行を削除するだけです。

于 2013-01-05T10:05:36.283 に答える