C++ 为什么必须为该函数动态分配扩展数组才能正常工作C++;

C++ 为什么必须为该函数动态分配扩展数组才能正常工作C++;,c++,arrays,memory-management,scope,C++,Arrays,Memory Management,Scope,我一直在研究一个函数,它接受数组和数组大小作为参数。函数任务是创建第二个数组,其大小是第一个数组的两倍,将第一个数组的元素复制到第二个数组的前半部分,并将其余元素初始化为零 只有在函数中使用动态分配第二个数组时,我才能使其工作。我怀疑这是因为一旦函数将控制权返回给调用函数,任何未动态分配的数组都会从内存中删除。换句话说,调用函数中的指针将指向垃圾数据,因为在expander函数中创建的第二个数组现在已不存在。有人能证实这一点吗 下面是用两种不同方式编写的函数 这种方法有效 int *array_

我一直在研究一个函数,它接受数组和数组大小作为参数。函数任务是创建第二个数组,其大小是第一个数组的两倍,将第一个数组的元素复制到第二个数组的前半部分,并将其余元素初始化为零

只有在函数中使用动态分配第二个数组时,我才能使其工作。我怀疑这是因为一旦函数将控制权返回给调用函数,任何未动态分配的数组都会从内存中删除。换句话说,调用函数中的指针将指向垃圾数据,因为在expander函数中创建的第二个数组现在已不存在。有人能证实这一点吗

下面是用两种不同方式编写的函数

这种方法有效

int *array_expander(int array[], int size)
{

    int *new_array = new int[size*2];

    for(int i{0}; i < size; i++)
        *(new_array + i) = *(array + i);

    for(int i{size}; i < size * 2; i++)
        *(new_array + i) = 0;

    return new_array;
}
int*数组扩展器(int数组[],int大小)
{
int*new_数组=新int[size*2];
对于(inti{0};i
这条路不行

int *array_expander(int array[], int size)
{
    int new_array[size * 2];

    for(int i{0}; i < size; i++)
        *(new_array + i) = *(array + i);

    for(int i{size}; i < size * 2; i++)
        *(new_array + i) = 0;

    int *arr_ptr = new_array;

    return new_array;
}
int*数组扩展器(int数组[],int大小)
{
int新_数组[size*2];
对于(inti{0};i
你说得对。您不能从函数返回指向具有自动存储持续时间的本地对象的指针,因为返回的指针将无效,因为退出函数后本地对象将不活动

此外,可变长度数组不是标准C++特性。所以这个声明

int new_array[size * 2];
无法由没有自己相应语言扩展名的编译器编译

至于函数,那么它应该声明为

int * array_expander( const int array[], size_t size );
您应该将限定符const添加到第一个参数中,因为传递的数组在函数中没有更改

该功能可以通过使用标准算法来实现,如下面的演示程序所示

#include <iostream>
#include <algorithm>

int * array_expander( const int array[], size_t size )
{
    int *new_array = new int[ 2 * size ];

    std::fill_n( std::copy( array, array + size, new_array ), size, 0 );

    return new_array;
}

int main() 
{
    int a[] = { 1, 2, 3, 4, 5 };
    const size_t N = sizeof( a ) / sizeof( *a );

    for ( const auto &item : a ) std::cout << item << ' ';
    std::cout << '\n';

    int *new_array = array_expander( a, N );
    size_t n = 2 * N;

    for ( size_t i = 0; i < n; i++ ) 
    {
        std::cout << new_array[i] << ' ';
    }
    std::cout << '\n';

    delete [] new_array;

    return 0;
}

请注意,您可以使用标准容器而不是数组
std::vector

一些编译器允许您这样做,但大多数编译器不允许。这是因为当您使用以下方法创建阵列时:

int arr[10];
这里的'10'是一个'const int'。要静态创建数组,给定的大小必须是常量整数。 同样,您也可以这样做:

const int size = 10;
int arr[size];
int size;
cin >> size;
int *arr = new int[size]; // You can use it like an array now!
但如果你尝试这样做:

int size;
cin >> size;
int arr[size]; // Illegal
您可以看到,大小不是预定义的,并且随用户输入而变化。这是行不通的。这就是我们使用动态内存分配的原因。 我们需要这样做:

const int size = 10;
int arr[size];
int size;
cin >> size;
int *arr = new int[size]; // You can use it like an array now!

我希望这有帮助!:-)

是的,你理解对了。正如我的一位老师常说的,“最糟糕的垃圾:看起来不错的垃圾。”这能回答你的问题吗?更不用说,
intnew_数组[size*2]是非标准C++,因为它是VLA(可变长度数组),它不被C++标准支持,但可能是由编译器扩展启用的。代码>不是标准C++,所以如果输入已经变长,则应该移动到<代码> STD::vector < /代码>,因为<代码> int数组[大小];如果
size
不是编译时常量,则不允许使用code>。如果是,您可以考虑使用
std::array
,它基本上是
int[N]
的包装器,可以由函数返回。如果数组的大小是固定的,您必须对函数进行模板化。“您可以使用标准容器std::vector”或
std::array
,而不是数组。我感谢您的所有回复和建议。谢谢大家。这是我的荣幸!:-)。。。祝你的编程好运!