- 已关闭。**此问题为not reproducible or was caused by typos。当前不接受答案。
这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
3天前关闭。
Improve this question
我试图在堆上分配一个数组,这样我就可以将它作为一个函数的输出返回,该函数应该反转元素的顺序。然而,当我运行程序时,array1的第一个元素丢失了,并且我在array2的开头得到了垃圾。
另外,由于我使用的是动态内存,所以我必须使用delete命令释放内存,还是因为它在reverseArray函数的本地作用域内而自动删除它?
#include <iostream>
unsigned *reverseArray(unsigned *arr)
{
unsigned *output = (unsigned*) malloc(sizeof(int)*5);
for(unsigned i = 0; i < 5; ++i)
output[i] = arr[5 - i];
return output;
}
int main()
{
unsigned array1[5] = {10, 20, 30, 40, 50};
unsigned *array2 = reverseArray(array1);
for(unsigned i = 0; i < 5; ++i)
std::cout << array2[i] << " ";
std::cout << std::endl;
return 0;
}
我得到的输出是
32751 50 40 30 20
3条答案
按热度按时间qrjkbowd1#
正如评论中所指出的,你的索引是错误的:
5-i
访问字段5、4、3、2、1。忽略0
,更重要的是,访问数组末尾之后的字段。但是,您可以只使用标准库的
std::reverse
函数模板,它甚至可以就地操作:如果你想保留原来的数组,使用
std::array
,它有一个方便的复制构造函数:这样做的优点是不执行动态分配。
std::reverse
也完全就地操作,因此以后不需要清理任何内容。如果你有一个在编译时 * 不 * 知道的值数组,就像你的
array1
一样,你可以使用std::vector
,它会在你完成后清理内存。std::reverse
也可以使用它。r1zhe5dt2#
问题出在这一行:
由于
i
将得到值[0,1,2,3,4],因此5 - i
将得到值[5,4,3,2,1]。为了得到所需的从0开始的索引([4,3,2,1,0]),需要减去1:
在C中,最好使用
std::vector
作为动态数组。除了其他优点之外,它还可以节省手动
new
和delete
(或者malloc
和free
,尽管在c中完全不鼓励使用它们,而在极少数情况下需要使用new
/delete
)的需要(以及潜在的bug)。kninwzqo3#
如果你正在写一个C++程序,那么使用运算符
new
代替C函数malloc
。例如
当不再需要内存时,您应该释放所有分配的内存。
函数具有未定义的行为,因为在此语句中
当
i
等于0
时,存在对所传递数组之外的内存的访问,因为在这种情况下,语句如下所示此外,函数参数应该具有限定符
const
,因为传递的数组在函数中不会更改。在函数中使用幻数
5
也会使函数无用。该程序可以如下所示
注意有标准的
std::reverse_copy
算法可以使用,使用这个算法程序可以看起来如下不需要动态分配一个新数组。否则,您可以编写如下代码
如果需要反转源阵列,请按以下方式使用另一种算法
std::reverse