gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:33:16 29 4
gpt4 key购买 nike

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

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

这是用两种不同方式编写的函数。

这个方法有效

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 *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;
}

最佳答案

你是对的。您不能从函数中返回具有自动存储期限的本地对象的指针,因为退出函数后本地对象将不再存活,因此返回的指针将无效。

此外,可变长度数组不是标准 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;
}

程序输出为

1 2 3 4 5 
1 2 3 4 5 0 0 0 0 0

请注意,您可以使用标准容器 std::vector 来代替数组。

关于c++ - 为什么必须动态分配扩展数组才能使该函数正常工作 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59203442/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com