C++ 调整通过引用传递的动态分配数组的大小
我被困在这个问题中:如何在函数内部调整已通过引用传递给函数的动态分配数组的大小。 我尝试了这个方法,同时也尝试了无数种方法。当然,这只是一个示例,它应该打印“john”十次,扩展一个通过引用传递的数组,该数组最初只有1个大小(即只有1个名称)C++ 调整通过引用传递的动态分配数组的大小,c++,C++,我被困在这个问题中:如何在函数内部调整已通过引用传递给函数的动态分配数组的大小。 我尝试了这个方法,同时也尝试了无数种方法。当然,这只是一个示例,它应该打印“john”十次,扩展一个通过引用传递的数组,该数组最初只有1个大小(即只有1个名称) #include "stdafx.h" #include <string> #include <iostream> using namespace std; int NumLast=-1; int Surname(string *
#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");
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
int NumLast=-1;
int姓氏(字符串*MyData)
{
对于(inti=0;i您必须通过引用进行传递。您通过值进行传递。您将获得
&*Data = Data
The value of the address of what is pointed to Data = Data
#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");
}
然后通过值将其传递给姓氏。姓氏对其所做的任何操作都不会影响main
中的Data
int Surname(string *MyData) // This will take a copy of whatever you passed in to MyData
#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");
}
应为(引用运算符应位于函数定义上。)
#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");
}
电话将会是
void main()
{
string *Data = new string[1];
Surname(Data); // The function will take a reference of data.
#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");
}
请允许我问一下为什么要在循环中分配
#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");
}
看来std::vector是最适合您的解决方案
<> LI>如果您真的需要重新分配,请考虑旧的MalCube()、For()、RealLoor()接口。记住的主要内容是不要将它与C++新的/Delphi接口混合,尽管通常使用MalCube(/FrE.)/ /For(./LIE)实现NeX/DELL。
若你们需要数组,你们应该传递的不是数组,而是指向数组(双指针)的指针(或引用)。对于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;
}
#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");
}
与此代码完全相同:
Surname(Data);
#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");
}
>现在让我们来看看<代码>姓氏<代码>:
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;
}
#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");
}
请稍等。数据
指向哪里?嗯……它指向很久以前已经删除的数据。为什么
#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");
}
好的,姓氏
收到了数据
指针的副本。当它调用delete[]MyData
时,它删除了它MyData
指向的数组(与数据
指向的数组相同)。当姓氏
后来调用MyData=Temp
时,所有更改都是MyData
(指向函数姓氏
)和数据
(主中的指针
)的本地指针副本未受影响,继续指向现在已删除的内存
#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");
}
其他人已经解释了如何才能达到你想要的效果,我不会重复他们所写的内容。但我想敦促你坐下来思考姓
的作用,以及代码是如何不清楚和混乱的,以及如何重写代码,以便更容易理解,更不容易出错。对于那些未来需要帮助的人来说同样问题的解决方案是修订后的代码:
#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");
}
#包括“stdafx.h”
#包括
#包括
使用名称空间std;
int NumLast=-1;
int姓氏(字符串*&MyData)
{
对于(int i=0;ivoid main
是非标准的。使用int main()
。看看如何使用std::string
,是否也允许使用std::vector
或类似的方法?为什么不使用std::vector
?顺便说一句,您的函数访问新数组是越界的。NumLast
从-1开始,递增为0,数组大小为1,然后MyDara[1]
已分配给。此代码(全部15行)有这么多的bug,一点都不好笑。说真的。@RomanNikitchenko,我很确定C++03也不允许。我肯定C++11不允许。我不知道它是从C99还是什么开始的,但C目前接受实现定义的签名。我在循环中分配,因为数据数组应该由插入到该数组中的文件路径填充当函数提取目录中包含的文件名时,请稍候。@FrancescoPalazzetti很高兴我能提供帮助。无需道歉。我们都在某些时候犯过错误。正如您所说,重要的是要学习。感谢大家!问题正式解决了!:-)