C++ 新手,请帮助识别代码指针代码的问题

时间:2021-03-11 03:40:58

标签: c++

我的 getPosNums3 函数有问题......所有其他函数都可以按照我的需要工作。我在一般理解指针方面遇到问题,但我相信这会通过。上述函数会根据我的需要输出大小和地址,但是当我打印新修改的数组时,它会打印出类似于以下内容的长相同负整数:-5476891、-5476891。它会输出适量的整数,这告诉我这是一个小调整,挂断了我的代码......所有这些函数都将数组修改为仅其正值;他们只是通过不同的方法来做到这一点。感谢您的帮助

#include <iostream>
using namespace std;

typedef int* IntArrayPtr;

int* getPosNums1(int* arr, int arrSize, int& outPosArrSize);
int* getPosNums2(int* arr, int arrSize, int* outPosArrSizePtr);
void getPosNums3(int* arr, int arrSize, int*& outPosArr, int& outPosArrSize);
void getPosNums4(int* arr, int arrSize, int** outPosArrPtr, int* outPosArrSizePtr);
void printNewArray(int* arr, int arrSize);
void fillArray(int a[], int size);

int main() {
    cout << "Fuction 1: " << endl;
    int array_size;
    cout << "What is the size of the array? ";
    cin >> array_size;
    IntArrayPtr a;
    a = new int[array_size];
    fillArray(a, array_size);
    int posArraySize;
    int* posNums1 = getPosNums1(a, array_size, posArraySize);
    cout << "Original array is: ";
    printNewArray(a, array_size);
    cout << "The new address is " << posNums1 << " and the new size is " << posArraySize << " " << endl;
    cout << "New array is: ";
    printNewArray(posNums1, posArraySize);
    delete[] a;
    cout << endl;

    cout << "Function 2: " << endl;
    int array_size2;
    cout << "What is the size of the array? ";
    cin >> array_size2;
    a = new int[array_size2];
    fillArray(a, array_size2);
    cout << "Original array is: ";
    printNewArray(a, array_size2);
    int* posArraySize2 = &array_size2;
    int* posNums2 = getPosNums2(a, array_size2, posArraySize2);
    cout << "The new address is " << posNums2 << " and the new size is " << *posArraySize2 << " " << endl;
    cout << "New array is: ";
    printNewArray(posNums2, *posArraySize2);
    delete[] a;
    cout << endl;


    cout << "Function 3: " << endl;
    int array_size3;
    cout << "What is the size of the array? ";
    cin >> array_size3;
    a = new int[array_size3];
    fillArray(a, array_size3);
    cout << "Original array is: ";
    printNewArray(a, array_size3);
    int* posNums3 = new int[array_size3];
    int posArraySize3 = array_size3;
    getPosNums3(a, array_size3, posNums3, posArraySize3);
    cout << "The new address is " << posNums3 << " and the new size is " << posArraySize3 << endl;
    cout << "New array is: ";
    printNewArray(posNums3, posArraySize3);
    delete[] a;
    cout << endl;

    cout << "Function 4: " << endl;
    int array_size4;
    cout << "What is the size of the array? ";
    cin >> array_size4;
    a = new int[array_size4];
    fillArray(a, array_size4);
    cout << "Original array is: ";
    printNewArray(a, array_size4);
    int* posNums4ptr = &array_size4;
    int* posNums4 = new int[array_size4];
    int** posNums4ptrptr = &posNums4;
    getPosNums4(a, array_size4, posNums4ptrptr, posNums4ptr);
    cout << "The new address is " << posNums4ptrptr << " and the new size is " << *posNums4ptr << endl;
    cout << "New array is: ";
    printNewArray(posNums4, *posNums4ptr);
    delete[] a;
    return 0;
}

int* getPosNums1(int* arr, int arrSize, int& outPosArrSize) {
    int* newArray = new int[arrSize];
    int counter = 0;

    for (int i = 0; i < arrSize; i++) {
        if (arr[i] > 0) {
            newArray[counter] = arr[i];
            counter++;
        }
    }
    outPosArrSize = counter;

    return newArray;
}

int* getPosNums2(int* arr, int arrSize, int* outPosArrSizePtr) {
    int size = 0, counter = 0;
    int newArraySize = 0;
    for (int i = 0; i < arrSize; i++) {
        if (*(arr + i) > 0) {
            newArraySize++;
        }
    }
    int* newArray = new int[newArraySize];

    for (int i = 0; i < arrSize; i++) {
        if (*(arr + i) > 0) {
            newArray[counter] = *(arr + i);
            size++;
            counter++;
        }
    }

    *outPosArrSizePtr = size;

    return newArray;
}

void getPosNums3(int* arr, int arrSize, int*& outPosArr, int& outPosArrSize){
    int counter = 0, size = 0;
    for (int i = 0; i < arrSize; i++) {
        if (*(arr + i) > 0) {
            size++;
        }
    }

    int *newArray = new int[size];

    for (int i = 0; i < arrSize; i++) {
        if (*(arr + i) > 0) {
            newArray[counter] = *(arr + i);
            counter++;
        }
    }

    delete[] outPosArr;
    outPosArr = newArray;

    outPosArrSize = size;

    delete[] newArray;
    newArray = nullptr;
}

void getPosNums4(int* arr, int arrSize, int** outPosArrPtr, int* outPosArrSizePtr){
    int size = 0, counter = 0, newArraySize = 0;
    for (int i = 0; i < arrSize; i++) {
        if (*(arr + i) > 0) {
            newArraySize ++;
        }
    }

    int* temp = new int[newArraySize];

    for (int i = 0; i < arrSize; i++) {
        if (*(arr + i) > 0) {
            temp[counter] = arr[i];
            size++;
            counter++;
        }
    }

    *outPosArrSizePtr = size;
    *outPosArrPtr = temp;
}

void printNewArray(int* arr, int arrSize) {
    for (int i = 0; i < arrSize; i++)
        cout << arr[i] << " ";
    cout << endl;
}

void fillArray(int a[], int size) {
    cout << "Enter " << size << " integers." << endl;
    for (int i = 0; i < size; i++)
        cin >> a[i];
}

1 个答案:

答案 0 :(得分:2)

有问题的代码是

void getPosNums3(int* arr, int arrSize, int*& outPosArr, int& outPosArrSize){
    
    // [snip] count number of positive entries in arr and call it "size"

    int *newArray = new int[size];

    // [snip] copy positive entries in arr into newArray

    delete[] outPosArr;
    outPosArr = newArray;

    outPosArrSize = size;

    delete[] newArray;
    newArray = nullptr;
}

首先,这个函数用 delete[] outPosArr 不是一个好主意,因为它假定 outPosArr 要么是 nullptr,要么是之前用 new[] 分配的东西。如果它不是这两件事之一,则此函数具有未定义的行为。

有人调用函数来将数字复制到数组中,通常不会希望该函数也清除该数组中可能存在或不存在的某些先前内容。

但您真正的问题是您通过 int *newArray = new int[size] 为数组分配内存,复制内容,然后立即通过调用 delete[] newArray解除分配该内存。这使得 outPosArr 指向使用的数组。

此外,在函数末尾将 nullptr 分配给 newArray 没有任何作用,因为无论如何 newArray 都会超出范围。

相关问题