gpt4 book ai didi

c++ - 如何将一个数组重新分配给另一个数组?

转载 作者:行者123 更新时间:2023-11-28 05:02:28 25 4
gpt4 key购买 nike

是否可以将一个数组重新分配给另一个数组?像这样:这是函数 e02:

void e02(){
int a[] = {15, 9, 8, 4, 3};
int n = 5;
int x = 5;

fn02(a, n, x);

cout << endl;

for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}

这是函数 fn02:

void fn02(int* a, int &n, int x){
n += 1;

int* b = new int[n];

int j = 0;

bool put = false;

for(int i = 0; i < n; i++){
if(x > a[i] && put == false){
b[j] = x;
j++;
a--;
put = true;
} else{
b[j] = a[i];
j++;
} //else
} //i loop

a = b;
}

这应该将变量 n 放入数组中,但数组仍然需要降序排列。如果我像这样分配 a = b 那么我得到输出 15, 9, 8, 4, 3, 5 其中 5 是垃圾值。所以我的问题是:有没有办法像这里一样将一个数组重新分配给另一个数组?如果我使用像这样的指针

int* &p1;

然后把它放在函数中我得到了我想要的但是函数必须有那些参数并且必须是空的

最佳答案

我将提供一些可能会帮助您得出问题解决方案的概念。然后提供可以帮助您获得最终解决方案的快速解决方案。

...如果我只是像这样分配 a = b,那么我会得到输出 15, 9, 8, 4, 3, 5,其中 5 是一个垃圾值。

数字5的输出与你在fcn02中赋值a=b无关。值 5 实际上是调用函数中 x 的值。您正在访问其原始分配范围之外的数组,从而访问 int 大小的下一个地址的值。在这种情况下,它是 x 的值。如果你吐出 x 的地址和 a[6] 的地址,你会发现它们是相等的。

由于将值传递给函数的基本概念,您在 fcn02 中对 a=b 的分配无法按预期工作。当您调用函数 fcn02(a) 时,值“a”(数组开头的地址)被复制到 fcn02 中的“a”的值。在 fcn02 中更改“a”不会更改调用函数中的“a”。

澄清示例注意(使用相同的值“a”可能会造成混淆,因此我对其进行了一些更改)。:

int func02( int* b ) // address of a is copied to b
{

... // some code...c is dynamically allocated and has an address of 0x80004d30
b = c; // b is set to address of c; thus, b address is now 0x80004d30
// a is unchanged and you now have a memory leak since you didn't delete b.
}

int main()
{
int a[5] = {1,2,3,4}; // address is 0x28cc58
func02(a); // complier will make a copy of the value of a to b
// address (i.e. value) of a is still 0x28cc58

}

为什么看到5的内存布局:

int a[5] = {1,2,3,4,5};  // 0x28cc64 
int x = 7; // 0x28cc5c

{ array a }{ x }
---- ---- ---- ---- ---- ----
| 1 | 2 | 3 | 4 | 5 | 7 |
---- ---- ---- ---- ---- ----

但是要回答您的问题,您不能将一个数组分配给另一个数组。

int a[5] = {1,2,3,4,5};
int b[5];
b = a;
for ( int i = 0; i<5; ++i )
{
cout << b[i] << endl;
}

编译器不允许这样做。

这里有一个快速而肮脏的解决方案,可让您的函数参数保持相同以供指导:

void e02(){
int a[6] = {15, 9, 8, 4, 3, 0};
int sizeofA = 5;
int numToAdd = 5;

fn02(a, sizeofA, numToAdd);
cout << endl;

for(int i = 0; i < n; i++){
cout << a[i] << " ";
}
}

void fn02(int* a, int &n, int x){
n += 1;
int i = 0;
while( i < n )
{
if ( a[i] > x )
++i;
else {
int tmp = a[i];
a[i] = x;
x = tmp;
}
}
}

关于c++ - 如何将一个数组重新分配给另一个数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45582482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com