【发布时间】:2017-08-10 04:43:24
【问题描述】:
三个函数的“返回”值的使用有什么问题吗?打印出来的值是看似随机数作为输出的垃圾值。我还想补充一点,我没有让它递归,因为我想检查这是否可行。
我见过的大多数合并排序实现几乎不包含任何返回值,这是我做错了什么。如果你要进行类似类型的实现,你会怎么做?
#include <iostream>
using namespace std;
int* goleft(int array[], int size)
{
int halved=size/2;
int left[halved];
for(int i=0;i<halved;i++)
{
left[i]=array[i];
}
return left;
}
int* goright(int array[],int size)
{
int halved=size/2;
int right[size-halved];
for(int i=halved,j=0;i<size;i++,j++)
{
right[j]=array[i];
}
return right;
}
int* mergesort(int array[],int size)
{
int *l,*r;
l=goleft(array,size);
r=goright(array,size);
int merger[size];
int halved = size/2;
int i;
for(i=0;i<halved;i++)
cout<<l[i]<<endl;
for(i=0;i<halved;i++)
cout<<r[i]<<endl;
int x=0,y=0,k=0;
while(x+y!=size)
{
if(l[x]<r[y])
{
merger[k]=l[x];
x++;k++;
}
else if(l[x]>=r[y])
{
merger[k]=r[y];
y++;k++;
}
}
return merger;
}
int main()
{
int size;
cin>>size;
int array[size];
for(int i=0;i<size;i++)
cin>>array[i];
int *merged=mergesort(array,size);
cout<<"sorted array"<<endl;
for(int i=0;i<size;i++)
cout<<merged[i]<<endl;
return 0;
}
当我们在循环和递归过程中创建同名变量时,是否会为每个循环迭代或递归创建新变量?或者他们是否覆盖了前一个变量的值。例如当我们写时
while(true)
{
int i=0;
}
是否会在每次迭代时创建一个新变量 和
genericFunction()
{
int i = SomeRandomValue
genericFunction();
}
同样会在每次递归时创建一个新变量吗?
【问题讨论】:
-
编译器给了我一个警告警告:返回局部变量'merger'的地址 [-Wreturn-local-addr] int merge[size];
-
返回的指针指向堆栈分配的数组,这些数组在读取结果之前被销毁。另请注意,可变大小的数组不是标准 C++ 的一部分。
-
@dietmarKuhl “可变大小的数组不是 c++ 标准的一部分”是什么意思,我是新手,不太明白你的意思
-
@zaidjan1295:在 C++ 中,数组必须使用常量表达式来表示它们的大小。也就是说,像
T array[n];这样的结构只有在编译时知道n时才有效。 Chas 放宽了这个限制,一些 C++ 编译器允许将变量大小作为扩展。
标签: c++ recursion return mergesort