gpt4 book ai didi

c++ - 一个简单的 vector ,如何正确地重新分配新数组的地址

转载 作者:行者123 更新时间:2023-11-28 06:27:51 31 4
gpt4 key购买 nike

我正在尝试创建 vector 的简单版本。如果我只看我存储的内容,它似乎有效,但有一件事让我担心。这是我的代码:

#include <iostream>
using namespace std;

int main(){
char* arr = new char[1];
int size = 1; // current size of the array
int num_chars = 0; // how many characters are stored so far
char c;
while (true)
{
cout << ">";
cin >> c;
if (c == '!') break;
if (num_chars == size)
{
size *= 2;
char* new_arr = new char[size];
cout << "Old array address: " << &arr << endl;
cout << "New array address: " << &new_arr << endl;
for (int i = 0; i < size/2; i++) // copy arr to new_arr
new_arr[i] = arr[i];
delete[] arr;
arr = new_arr;
}
arr[num_chars++] = c;
for (int i = 0; i < num_chars; i++)
cout << arr[i];
cout << endl;
cout << &arr << endl;
}
delete[] arr;
return 0;
}

该程序一次接受一个字符,并将它们存储在一个动态增长的数组中,在您输入感叹号时结束。我添加了一些 cout 语句来检查我的输入以及数组的存储位置。

当我分配 new_arr 时,它获得一个新地址,然后我将 arr 的成员复制到新的 arr,删除 arr,并将 arr 分配给指向 new_arr。让我担心的部分是,当我在重新分配后检查 arr 的内存位置时,它和以前一样,所以看起来我只是在写到原始数组的末尾。如何正确地将指针重新分配给新数组?

这是一些示例输出:

>a
a
0x7fff5fbff760
>b
Old array address: 0x7fff5fbff760
New array address: 0x7fff5fbff748
ab
0x7fff5fbff760
>c
Old array address: 0x7fff5fbff760
New array address: 0x7fff5fbff748
abc
0x7fff5fbff760

最佳答案

您正在打印指针本身的地址,而不是数组的地址(即指针的内容)。

存储数组地址的内存位置(即变量 arr 的地址)保持不变。它不应该改变。因此,&arr总是一样的。但是存储在该位置的确实发生了变化(正如预期的那样)。

将代码改为

cout << "Old array address: " << static_cast<void*>(arr) << endl;

看看区别。

( static_cast<void*>(arr)arr 的类型从 char* 转换为 void* 。这样做的原因是 coutchar* 视为指向空终止字符串的指针,并打印字符串而不是指针的值。但是,如果我们将指针的类型更改为 cout 不解释的内容(例如 void* ),那么 cout 将只打印地址。)

关于c++ - 一个简单的 vector ,如何正确地重新分配新数组的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28204922/

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