一个简单的向量,如何正确地重新分配新数组的地址
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
将只打印地址。)
我正在尝试创建矢量的简单版本。如果我只看我存储的内容,它似乎有效,但有一件事让我担心。这是我的代码:
#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
将只打印地址。)