函数返回数组的地址而不是其值

时间:2019-11-03 13:09:23

标签: c++ pointers heap

int* filtrationBiggerValues(int* values, int nrValues, int givenValue) {
    int j = 0;
    int *new_array=NULL;
    new_array = new int[nrValues];
    for (int i = 0; i < nrValues; i++)
        if (values[i] >= givenValue)
        {
            new_array[j] = values[i];
            j++;
        }
    return new_array;

}



void main() {
    int y[] = { 1,2,100,18,20,94 };
    cout<< filtrationBiggerValues(y, 6, 8)<<"\n";

}

我应该看到新数组的值大于某个特定值,但是我得到了它的地址。

3 个答案:

答案 0 :(得分:1)

这不是它的工作方式。您从函数返回的指针不是值。如果要查看输出值,则应在数组上进行迭代并分别打印出每个元素。另外请注意从函数返回输出数组的大小,以方便迭代。

int* filtrationBiggerValues(int* values, int nrValues, int givenValue, int& outputSize) {
    int j = 0;
    int *new_array=NULL;
    new_array = new int[nrValues];
    for (int i = 0; i < nrValues; i++)
        if (values[i] >= givenValue)
        {
            new_array[j] = values[i];
            j++;
        }
    outputSize = j;
    return new_array;

}

void main() 
{
    int y[] = { 1,2,100,18,20,94 };
    int outputSize = 0;

    int* output = filtrationBiggerValues(y, 6, 8, outputSize);
    for(int i=0; i<outputSize; ++i)
    {
        cout<< output[i] <<"\n";
    }
}

更新(如果您希望保持功能签名不变)

int* filtrationBiggerValues(int* values, int nrValues, int givenValue) {
    int j = 0;
    int *new_array=NULL;
    new_array = new int[nrValues];
    for (int i = 0; i < nrValues; i++)
        if (values[i] >= givenValue)
        {
            new_array[j] = values[i];
            j++;
        }
    new_array[j] = 0;
    return new_array;

}

void main() 
{
    int y[] = { 1,2,100,18,20,94 };

    int* output = filtrationBiggerValues(y, 6, 8);
    for(int i=0; output[i]>0; ++i)
    {
        cout<< output[i] <<"\n";
    }
}

答案 1 :(得分:0)

数组的名称实际上是一个指针。 如果您尝试这样做:

  int main() 
   {
        int y[] = { 1,2,100,18,20,94 };
        cout << y <<endl;
        cout<< filtrationBiggerValues(y, 6, 8)<<"\n";
        return 0;
    }

输出是两个地址

0x7ffd7ac2bc10
0xfadc30

答案 2 :(得分:0)

这么多话:

int* new_array = NULL; C ++使用nullptr。即int* new_array = nullptr;

但是,您应该包含下一行所做的初始化:

int* new_array = new int[nrValues];

但是您只是在堆上创建了一个新对象,而没有delete。这就是所谓的内存泄漏。如今,我们使用唯一的指针来帮助我们。

std::unique_ptr<int[]> new_array = new int[nrValues];

但是,在C ++中,我们有STL容器为您处理所有C样式的数组内容。由于new_arrayvalues的大小不同,因此您可能要使用具有动态大小的std::vector。 STL容器有一个名为iterators的东西,可以更有效地遍历元素。但是,STL容器没有默认的输出功能,因此您必须编写自己的输出。

#include<vector>
#include<iostream>

std::vector<int> getBiggerThen(std::vector<int> const& input, int givenValue) {
    std::vector<int> output;

    for (auto it = input.cbegin(); it != input.cend(); it++) {
        if (*it > givenValue) {
            output.push_back(*it);
        }
    }
    return output;
}

std::ostream& operator<< (std::ostream& out, std::vector<int> const& vec) {
    for (auto const& el : vec) out << el << " ";
    return out;
}

int main() {
    auto y = std::vector<int>{ 1,2,100,18,20,94 };
    std::cout << getBiggerThen(y, 8) << "\n";
}

哦...也很重要:在C ++中,main应该总是返回int

最后,您经常要做的事情是,STL库具有内置的算法。可以减少一切

#include<vector>
#include<algorithm>
#include<iostream>

int main() {
    auto y = std::vector<int>{ 1,2,100,18,20,94 };
    std::vector<int> output{};
    int givenValue = 8;
    std::copy_if(std::cbegin(y), std::cend(y), std::back_inserter(output),
        [givenValue](int val) { return val >= givenValue; });
    for (auto const& el : output) std::cout << el << " ";
    std::cout << "\n";
}