在下面的代码中,我试图构建2个数组。第一个是用户给出的数组,第二个是一个已经排序的数组,虽然保持简短,因为实际的实现不是必需的:
int main()
{
int size = 0;
cout << "Please enter size: ";
cin >> size;
int array[size];
int newArray[size] = doSomething(array,&size);
return 0;
}
int* doSomething(int array[],int *size)
{
*size+=1;
int newArray[size];
//do something with the array and store it in the newArray
return newArray;
}
所以我的问题是:
我的老师告诉我,大多数编译器的工作方式不同,某些操作的顺序可能会有所不同。
在行int newArray [size] = doSomething(array,&amp; size);我希望在用于初始化newArray之前,在doSomething中更改size变量。一旦doSomething方法完成运行,它应该返回一个数组(我假设它只是返回阵列的第一个元素的地址,如果这个错误,请纠正我)。一旦它返回,我想将该地址存储到我的新数组中,其中变量大小用于初始化数组的大小。这个变量应该根据我的逻辑,等于用户+1输入的原始大小。因此,如果用户输入的大小为4,则newArray的大小应为5.这是一种很好的方法,或者它会为不同的编译器产生不可靠的结果吗?
出于本练习的目的,我只能使用内置数组和指针。所以我不能使用矢量。此外,在此示例中,newArray是一个较大的元素,但实际代码的大小是动态的,因此每次都可能不同。因此,我不能在声明中硬编码+1。
如果这是错误的,有人可以指出我正确的方向并帮助我找到一种方法,我可以传递内置数组(没有矢量或数组&lt;&gt;),修改它的内容和大小然后返回该数组并将其存储在调用方法中的变量中?
非常感谢
答案 0 :(得分:1)
首先,标准C ++不允许所谓的可变长度数组(VLA);声明中数组的大小必须是编译时常量。标准C允许它们,gcc和clang都将它们作为扩展实现。从技术上讲,你的代码是不正确的C ++。
为了论证,让我们接受延期。现在我们有另一个问题,即数组不能用作数组的初始化器。 (一个数组可用于初始化一个指针,因为该数组将衰减到该上下文中的指针,但指针根本没有大小。但是,如果你做了tgat,那么,你会引入一个不同的问题:返回的数组具有自动存储持续时间,这意味着它会被立即销毁并解除分配。因此,它是一个&#34;悬空指针&#34;并且使用它是未定义的行为。)你可以通过将数组包装在struct
中来解决这个限制。
这些都没有涉及您对此感到好奇的评估问题。答案是订单未指定;编译器可能会在为数组分配空间之前或之后评估函数调用。因此,即使您的编译器允许VLA,也未指定此大小。
答案 1 :(得分:1)
你有问题:
cin >> size;
int array[size];
除非你使用new
,否则你不能这样做。编译器在程序运行之前创建数组容器,因此一旦它运行就不能给它自定义大小。
您必须将数组分配为堆上的新对象:
cin >> size;
int* array = new int[size];
也许这会指向正确的方向,但是我不知道您要调用哪些类,因为您没有包含所有源代码。
我编辑了我以前的答案,因为我相信你试图简单地调用一个int数组,而不是一个名为“array”的类。如果你只想要一个C风格的整数数组,上面的例子就是你如何正确地完成它。
使用完您应该拨打的数据后,请记住
delete[] array;