调整通过引用传递的动态分配数组的大小
Resizing a dynamically allocated array passed by reference
我被困在这个问题:如何调整大小,在一个函数中,一个动态分配的数组,它已经通过引用传递给函数。我尝试了这个方法,以及无数的这种方法的变化。当然,这只是一个例子,它应该打印"john"10次,扩展一个数组,最初只有大小为1(即只有一个名字)的引用传递。
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int NumLast=-1;
int Surname(string *MyData)
{
for (int i=0; i<10 ; i++)
{
NumLast++;
string *Temp = new string[NumLast+1]; // temporary array
for (int jjj=0; jjj<NumLast; jjj++)
Temp[jjj]=MyData[jjj];
delete[] MyData;
MyData=Temp;
MyData[NumLast]="John";
}
return 0;
}
void main()
{
string *Data = new string[1]; // inizializza l'array
Surname(&*Data);
for (int iii=0; iii<10; iii++)
cout << Data[iii] << endl;
system("pause");
}
您必须通过引用传递。你在传递价值。你得到
&*Data = Data
The value of the address of what is pointed to Data = Data
然后按值传递给姓。Surname
对它的任何影响都不会影响main
中的Data
。
int Surname(string *MyData) // This will take a copy of whatever you passed in to MyData
应该是(引用操作符应该在函数定义上)
int Surname(string*& MyData)
^^
调用将是
void main()
{
string *Data = new string[1];
Surname(Data); // The function will take a reference of data.
我可以问一下你为什么在循环中分配吗?
- 看起来std::vector是您的最佳解决方案。
- 如果你真的需要手动重新分配,考虑一下老派的malloc(), free(), realloc()接口。要记住的主要事情是不要将它与c++的new/delete接口混在一起,尽管new/delete通常是使用malloc()/free()实现的。如果你需要数组,你不应该传递数组,而是传递指针(或引用)到数组(双指针)。在std::vector的情况下,向它传递引用就足够了。
- 另一个使用std::vector引用的参数——在指针指向数组调用者的情况下,应该以某种方式通知新的数组大小。
我决定尝试逐行检查您的代码,并指出一些问题并强调正在发生的事情。我将从您的main
函数开始:
void main()
{
string *Data = new string[1]; // inizializza l'array
Surname(&*Data);
for (int iii=0; iii<10; iii++)
cout << Data[iii] << endl;
}
好的,这段代码所做的是分配一个字符串,并将指针保存在一个名为Data
的变量中。
然后它解引用 Data
,因此,返回一个string
,然后获得该字符串的地址(即返回与Data
相同的东西)。
换句话说,这段代码:
Surname(&*Data);
的作用与下面的代码完全相同:
Surname(Data);
那么,现在我们来看看Surname
:
int Surname(string *MyData)
{
for (int i=0; i<10 ; i++)
{
NumLast++;
string *Temp = new string[NumLast+1]; // temporary array
for (int jjj=0; jjj<NumLast; jjj++)
Temp[jjj]=MyData[jjj];
delete[] MyData;
MyData=Temp;
MyData[NumLast]="John";
}
return 0;
}
这个奇怪的函数接受一个指向字符串的指针,并循环10次执行操作。让我们看看在循环的第一次迭代中发生了什么…
首先增加NumLast
(从-1
增加到0
)。然后分配一个字符串数组,长度为NumLast + 1
(即长度为1
)。到目前为止一切顺利。
现在你可能认为函数会进入for
循环。但它不会:记住,在这一点上,NumLast
和jjj
都是0
,因此,jjj < NumLast
是假的。
代码将delete[] MyData
(也就是说,它将删除MyData
指向的任何内容),设置MyData
指向在循环中早些时候分配的临时数组,然后设置第一个元素(索引0
)为字符串"John"
。
在循环的第二次迭代中,该函数再次增加NumLast
(现在为1),它将再次分配一个字符串数组,这次的长度为2
。
这次将进入循环。它将把MyData
的第一个条目复制到Temp
的第一个条目。它会退出
同样,MyData
将被删除,指针将指向新分配的数组。
冲洗。泡沫。重复。
最后,函数将退出。我们返回到main,它现在将执行这段代码:
for (int iii=0; iii<10; iii++)
cout << Data[iii] << endl;
请稍等。Data
指向哪里?嗯…它指向很久以前就已经删除的数据。为什么?
好,Surname
收到了Data
指针的拷贝。当它调用delete[] MyData
时,它删除了MyData
所指向的数组(即Data
所指向的数组)。当Surname
之后执行MyData=Temp
时,所有改变的都是MyData
(指针local指向函数Surname
的副本)和Data
(指针在main
中)不受影响,继续指向现在已删除的内存。
其他人已经解释了如何得到你想要的效果,我不会重复他们写的。但是我建议你坐下来想想Surname
是做什么的,代码是如何不清楚和令人困惑的,以及如何重写它,以便更容易理解,更不容易出错。
对于那些将来需要解决同样问题的人来说,这里是修改后的代码:
#include "stdafx.h"
#include <string>
#include <iostream>
using namespace std;
int NumLast=-1;
int Surname(string *&MyData)
{
for (int i=0; i<10 ; i++)
{
NumLast++;
string *Temp = new string[NumLast+1];
for (int jjj=0; jjj<NumLast; jjj++)
Temp[jjj]=MyData[jjj];
delete[] MyData;
MyData=Temp;
MyData[NumLast]="franci";
}
return 0;
}
void main()
{
string *Data = new string[1]; // inizializza l'array
Surname(Data);
for (int iii=0; iii<10; iii++)
cout << Data[iii] << endl;
system("pause");
}
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 动态更改数组的大小并读取值.(无矢量)
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 动态维度数组的 C++ 别名指针
- C++ 在析构函数调用之前删除的动态成员数组
- 从类 c++ 动态创建数组
- 具有静态 std::array 的神经网络比使用动态 C 数组的神经网络慢
- "Error reading character of string" 为哈希动态增长数组的问题 (C++)
- 为什么我们在传递动态 2D 数组时不需要列数?
- 如何解决在使用动态 2D 数组进行矩阵乘法的 MPI 进行并行编程时的问题
- 使用动态布尔数组时出现问题
- C++ 在类中删除动态 2D 数组时不断"Aborted (core dumped)"
- 如何在C 中动态输入数组
- 关于删除动态对象数组
- 在C 中动态更改数组大小
- 使用动态指针数组进行动态对象分配 - 使用什么删除?
- 动态字符串数组分配错误
- 函数中的动态 2D 数组分配并将其返回给主数组
- c++动态字符串数组分配
- 使用字符串或字符动态分配(数组)