函数 C++ 中的动态分配
Dynamic allocation in function C++
我在使用 'new' 和引用进行动态分配时遇到了一些麻烦。请看下面的简单代码。
#include<iostream>
using namespace std;
void allocer(int *pt, int *pt2);
int main()
{
int num = 3;
int num2 = 7;
int *pt=#
int *pt2 = &num2;
allocer(pt, pt2);
cout << "1. *pt= " << *pt << " *pt2= " << *pt2 << endl;
cout << "2. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
}
void allocer(int *pt, int *pt2)
{
int temp;
temp = *pt;
pt = new int[2];
pt[0] = *pt2;
pt[1] = temp;
cout << "3. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
}
我想要做的是让函数 'allocer' 获得 2 个参数,它们是 int 指针,并在其中一个上分配内存。如您所见,*pt 变成了一个包含 2 个整数的数组。在函数内部它运行良好,这意味着我标记为 3 的句子按我的意图打印。但是,1、2 不起作用。 1 打印原始数据(*pt= 3, *pt2= 7),2 打印错误(*pt= 3, *pt2= -81203841)。
如何解决?
您正在按值传递 pt
和 pt2
变量,因此 allocer
分配给它们的任何新值仅保留在 allocer
本地,而不是反射回 main
.
要执行您正在尝试的操作,您需要通过引用 (int* &pt
) 或指针 (int** pt
) 传递 pt
,以便 allocer
可以修改main
中的变量被引用。
此外,根本没有充分的理由将 pt2
作为指针传递,因为 allocer
不将其用作指针,它只是取消引用 pt2
以获取实际的 int
,因此您应该按值传入实际的 int
。
试试像这样的东西:
#include <iostream>
using namespace std;
void allocer(int* &pt, int i2);
int main()
{
int num = 3;
int num2 = 7;
int *pt = #
int *pt2 = &num2;
allocer(pt, *pt2);
cout << "1. *pt= " << *pt << " *pt2= " << *pt2 << endl;
cout << "2. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
delete[] pt;
return 0;
}
void allocer(int* &pt, int i2)
{
int temp = *pt;
pt = new int[2];
pt[0] = i2;
pt[1] = temp;
cout << "3. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
}
或
#include <iostream>
using namespace std;
void allocer(int** pt, int i2);
int main()
{
int num = 3;
int num2 = 7;
int *pt = #
int *pt2 = &num2;
allocer(&pt, *pt2);
cout << "1. *pt= " << *pt << " *pt2= " << *pt2 << endl;
cout << "2. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
delete[] pt;
return 0;
}
void allocer(int** pt, int i2)
{
int temp = **pt;
*pt = new int[2];
(*pt)[0] = i2;
(*pt)[1] = temp;
cout << "3. pt[0]= " << (*pt)[0] << " pt[1]= " << (*pt)[1] << endl;
}
你刚才做的是你动态分配了函数内部的 pt。而且这个函数变量pt是局部的,和main函数中的pt不一样。
你可以做的是,如果你想为该指针动态分配内存,你可以传递指针本身的地址。
我在使用 'new' 和引用进行动态分配时遇到了一些麻烦。请看下面的简单代码。
#include<iostream>
using namespace std;
void allocer(int *pt, int *pt2);
int main()
{
int num = 3;
int num2 = 7;
int *pt=#
int *pt2 = &num2;
allocer(pt, pt2);
cout << "1. *pt= " << *pt << " *pt2= " << *pt2 << endl;
cout << "2. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
}
void allocer(int *pt, int *pt2)
{
int temp;
temp = *pt;
pt = new int[2];
pt[0] = *pt2;
pt[1] = temp;
cout << "3. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
}
我想要做的是让函数 'allocer' 获得 2 个参数,它们是 int 指针,并在其中一个上分配内存。如您所见,*pt 变成了一个包含 2 个整数的数组。在函数内部它运行良好,这意味着我标记为 3 的句子按我的意图打印。但是,1、2 不起作用。 1 打印原始数据(*pt= 3, *pt2= 7),2 打印错误(*pt= 3, *pt2= -81203841)。 如何解决?
您正在按值传递 pt
和 pt2
变量,因此 allocer
分配给它们的任何新值仅保留在 allocer
本地,而不是反射回 main
.
要执行您正在尝试的操作,您需要通过引用 (int* &pt
) 或指针 (int** pt
) 传递 pt
,以便 allocer
可以修改main
中的变量被引用。
此外,根本没有充分的理由将 pt2
作为指针传递,因为 allocer
不将其用作指针,它只是取消引用 pt2
以获取实际的 int
,因此您应该按值传入实际的 int
。
试试像这样的东西:
#include <iostream>
using namespace std;
void allocer(int* &pt, int i2);
int main()
{
int num = 3;
int num2 = 7;
int *pt = #
int *pt2 = &num2;
allocer(pt, *pt2);
cout << "1. *pt= " << *pt << " *pt2= " << *pt2 << endl;
cout << "2. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
delete[] pt;
return 0;
}
void allocer(int* &pt, int i2)
{
int temp = *pt;
pt = new int[2];
pt[0] = i2;
pt[1] = temp;
cout << "3. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
}
或
#include <iostream>
using namespace std;
void allocer(int** pt, int i2);
int main()
{
int num = 3;
int num2 = 7;
int *pt = #
int *pt2 = &num2;
allocer(&pt, *pt2);
cout << "1. *pt= " << *pt << " *pt2= " << *pt2 << endl;
cout << "2. pt[0]= " << pt[0] << " pt[1]= " << pt[1] << endl;
delete[] pt;
return 0;
}
void allocer(int** pt, int i2)
{
int temp = **pt;
*pt = new int[2];
(*pt)[0] = i2;
(*pt)[1] = temp;
cout << "3. pt[0]= " << (*pt)[0] << " pt[1]= " << (*pt)[1] << endl;
}
你刚才做的是你动态分配了函数内部的 pt。而且这个函数变量pt是局部的,和main函数中的pt不一样。 你可以做的是,如果你想为该指针动态分配内存,你可以传递指针本身的地址。