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

时间:2015-01-29 00:17:19

标签: c++ arrays pointers

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

#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

1 个答案:

答案 0 :(得分:1)

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

存储阵列地址的内存中的位置(即变量arr的地址)保持不变。它不应该改变。因此,&arr始终是相同的。但是存储在该位置的确实发生了变化(正如预期的那样)。

将代码更改为

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

并看到差异。

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