首页 > 解决方案 > c++ 使用动态分配运算符反转数组元素

问题描述

嗨,我是 C++ 的初学者。这一次,我尝试使用动态分配运算符来反转 Array 的元素顺序。例如数组{1,2,3,4}将通过调用函数'reverseArray'重新排列{4,3,2,1}。一切正常,但不知何故我得到了不需要的整数“-1”以及重新排列的数组。例如 {-1,4,3,2,1}。这意味着我做错了,我真的想知道我的错。这是我的代码,请帮我弄清楚。

#include<iostream>
#include<new>

using namespace std;

void reverseArray(int [] , int);

int main(){

    int num=0;

    cout << "enter size of pointer : " ;
    cin >> num ;

    int *pointerArray = new int [num];

    cout << "enter integer numbers in pointer" << endl;

    for(int index = 0 ; index < num ; index++){
        cin >> pointerArray[index];     
    }

    reverseArray(pointerArray, num);

delete[] pointerArray;
    return 0 ; 
}

void reverseArray(int reverse[], int Size){
    int*ptArray[Size]; 

    cout << "the reverse order of entered numbers is : " << endl;
    for(int index = 0 ; Size >= 0 ; index++) {
        ptArray[index] = &reverse[Size];
        cout << *ptArray[index] << " " ;
        --Size; 
    }

    return ; 
}

标签: c++arraysreversedynamic-memory-allocation

解决方案


在您的代码中,您在第一次迭代时访问数组越界,因为对于大小Size有效索引的数组0最多Size-1

目前尚不清楚为什么要创建一个指针数组,它int*ptArray[Size];是一个非标准 C++ 的可变长度数组 (VLA)。此外,您不需要包含<new>.

要打印动态大小(即大小取自输入)数组,您将使用 astd::vector和循环:

#include <vector>
#include <iostream>

int main(){   
    size_t size;
    std::cout << "enter size: ";
    std::cin >> size;
    std::vector<int> data(size);
    for (auto& element : data) std::cin >> element;
    for (size_t i = 0; i < data.size(); ++i) {
        std::cout << data[ data.size()-1-i ]; // first element printed is data[data.size()-1]
    }    
}

如果要反转数组,而不仅仅是以相反的顺序打印,std::reverse<algorithm>. 该算法也适用于动态分配的数组:

#include <iostream>
#include <algorithm>

int main(){   
    size_t size;
    std::cout << "enter size: ";
    std::cin >> size;

    int* data = new int[size];
    for (size_t i=0; i<size; ++i) std::cin >> data[i];

    std::reverse(data,data+size);
    for (size_t i=0; i<size; ++i) std::cout << data[i];

    delete [] data;
}

推荐阅读