我正在尝试创建一个简单版本的矢量。如果我只关注我正在存储的东西,它似乎有效,但有一件事让我担心。这是我的代码:
#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
答案 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
将只打印地址。)