一个简单的向量,如何正确地重新分配新数组的地址

A simple vector, how can I reassign the address for a new array correctly

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

#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 始终相同。但是存储在该位置的 value 确实发生了变化(正如预期的那样)。

将代码更改为

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

看看区别。

(static_cast<void*>(arr)arr 的类型从 char* 转换为 void*。这样做的原因是 cout 对待 char*作为指向以 null 结尾的字符串的指针,并打印字符串的内容而不是指针的值。但是,如果我们将指针的类型更改为 cout 无法解释的内容(例如 void* ), 然后 cout 将只打印地址。)