循环中的矢量到数组不起作用

Vector to array within a loop not working

本文关键字:数组 不起作用 循环      更新时间:2023-10-16

当我尝试将整数向量转换为循环内的整数数组时,尽管在循环中转换似乎已经有效,但一旦循环终止,数组中的值就不正确。

我尝试了 std::copy 而不是 &vector[0],但出现了同样的问题。而且我知道不需要将向量转换为数组。我认为问题是由于数组被分配了一个指向变量的指针,该变量在循环后被销毁,但我对 c++ 相当陌生,所以即使我是正确的,我也不知道如何解决它。

#include "pch.h"
#include <iostream>
#include <vector>
int main()
{
int* arr;
for (int i = 0; i < 1; i++)
{
std::vector<int> vec{ 1 };
arr = &vec[0];
std::cout << "Inside the loop in the vector: " << vec[0] << std::endl;
std::cout << "Inside the loop in the array: " << arr[0] << std::endl;
}
std::cout << "Outside the loop in the array: " << arr[0];
}

我希望输出如下所示:

向量中的循环内部:1 数组中的循环内部:1数组中的循环外部:1

但实际上结果是这样的:

向量中的循环内部:1 数组中的循环内部:1
数组中的循环外部:-
572662307

int* arr;<- 这是一个指针,而不是数组。

std::vector<int> vec{ 1 };<-此向量仅存在于循环的主体中。这意味着,每次迭代都会创建一个新向量,并在迭代结束时销毁它,从而释放它分配的内存。

arr = &vec[0];<-此行不会复制任何内容,它只是将arr指向的地址设置为矢量分配内存中的第一个元素。

由于向量在循环后被销毁,因此arr指向的地址无效。只要您在循环内,它指向的地址就是有效的,您可以安全地访问该内存。

您尝试std::copy是对的,但是如果要复制任何内容,则需要首先分配可以复制到的内存。int arr[1];将创建一个大小为 1 的 int 数组,该数组可用作std::copy中的目标。int* arr = new int[1];也可以,但要求您以后自己释放内存(delete[] arr;)。我不建议自己管理记忆,除非出于学习目的。

vec超出范围时,将释放vec[0]的存储。 您不会期望指向它的指针在vec变量所在的范围之外有效。

我建议你阅读这个答案。