C++ 在这个有效的斐波那契函数中,不';它不能传递数组中可以存储的元素数吗?
这是我的代码,它是有效的。例如,当n=5时,它返回5。既然n=5,并且定义了arr[0]=0,那么就只剩下四个空间来存储从arr[1]到arr[4]的元素了吗? 但是,似乎可以存储6个元素(从arr[0]到arr[5]),我不知道如何存储C++ 在这个有效的斐波那契函数中,不';它不能传递数组中可以存储的元素数吗?,c++,arrays,fibonacci,C++,Arrays,Fibonacci,这是我的代码,它是有效的。例如,当n=5时,它返回5。既然n=5,并且定义了arr[0]=0,那么就只剩下四个空间来存储从arr[1]到arr[4]的元素了吗? 但是,似乎可以存储6个元素(从arr[0]到arr[5]),我不知道如何存储 int fibonacci(int n) { int i; int arr[n]; arr[0] = 0; for(i=1; i<=n; i++) { if(i==1) {
int fibonacci(int n) {
int i;
int arr[n];
arr[0] = 0;
for(i=1; i<=n; i++)
{
if(i==1)
{
arr[i] = 1;
}
else
{
arr[i] = arr[i-2] + arr[i-1];
}
}
return arr[n];
}
intfibonacci(intn){
int i;
int-arr[n];
arr[0]=0;
对于(i=1;ifor(i=1;i这是未定义的行为
幕后
幕后发生的事情是在堆栈上分配了5个int
s。假设它们被放在地址0x20
到0x30
。数组符号[]
对于使用指针来说确实是语法糖。这意味着arr[0]
实际上是指向0x20
的指针。在本例中,数组转换为以下地址(因为sizeof(int)=4
):
arr[0]
=(arr+0)
=0x20
arr[1]
=(arr+1)
=0x24
arr[2]
=(arr+2)
=0x28
arr[3]
=(arr+3)
=0x2C
arr[4]
=(arr+4)
=0x30
这一切都很好,您正在使用分配的内存进行操作。当您尝试写入索引5时会发生什么?嗯,基本上是一样的:
arr[5]
=(arr+5)
=0x34
它仍然只是指向您要写入的地址的指针。然而,问题是,您没有告诉任何人您打算写入该地址-内存没有为您预留
如果它没有被放在一边做任何其他事情,这很可能会好起来——正如你所观察到的
然而,如果它有,它可能会变成各种奇怪的行为,这取决于它被用来做什么。也许它已经被搁置,只是还没有被使用,也许它已经被使用,但只是被覆盖了,不会被再次检查。重点是我们不知道!因此它是危险的和未定义的
它之所以能在第一时间起作用,是因为——同样——它只是取消对指针的引用。而且取消对指针的引用应该会起作用,因为您应该了解编译器的更多信息。它可能会警告您可能不应该这样做,但这本身并不是一个错误
你应该怎么做
在C++中使用可变长度数组时,应该使用C++ 11中可用的现代工具。在这种情况下,建议使用<代码> STD::vector < /C> >。如果使用<代码> < <代码>函数,而不是<代码> ><代码>检查索引是否在边界内。
您面对int数组的问题。<代码> int ARR [n];< /C++ >如果编译时没有N修复,则不是有效的C++代码。您可以在代码< >代码:ST::vector < /代码>作为< /P>的帮助下重写代码。
int fibonacci(int n) {
std::vector<int> arr(n);
arr[0] = 0;
for(int i=1; i<=n; i++)
{
if(i==1)
{
arr[i] = 1;
}
else
{
arr[i] = arr[i-2] + arr[i-1];
}
}
return arr[n];
}
intfibonacci(intn){
std::向量arr(n);
arr[0]=0;
对于(int i=1;i它的意外行为,即使是C++文档警告,也可能删除边界检查。不仅如此,您甚至还指派给它。<强>这样更好地在范围内。< /强>
#include <iostream>
using namespace std;
int main(){
int i, n = 5;
int arr[n];
arr[0] = 0;
arr[1] = 1;
for(i=2; i<n; i++){
arr[i] = arr[i-2] + arr[i-1];
}
arr[8]=99; //assigning out of range
//accessing out of range
for(i=0;i<20;i++){
cout<<arr[i]<<" ";
}
}
#OUT: 0 1 1 2 3 0 211951624 1 99 32766 -484579280 32766 -1740650656 32767 -484579408 32766 5 0 5 0
#包括
使用名称空间std;
int main(){
int i,n=5;
int-arr[n];
arr[0]=0;
arr[1]=1;
对于(i=2),第一个C++没有,使用第二个条件:代码。>是的,我想我是越界的,但不知道为什么它仍然有效。尽管被破解,但仍然工作是一个未定义行为的例子。这是回答你的问题吗?是的,但是ARR(5)不是自ARR [ 0 ]以来就不存在界吗?=0是上面定义的,因此索引可以上升到4?@user11591356这是正确的,您看到的是UB,您可能很幸运,阵列后面没有存储任何其他数据,因此您没有遇到访问冲突或segfault,但您发布的代码肯定不正确谢谢您的评论!
#include <iostream>
using namespace std;
int main(){
int i, n = 5;
int arr[n];
arr[0] = 0;
arr[1] = 1;
for(i=2; i<n; i++){
arr[i] = arr[i-2] + arr[i-1];
}
arr[8]=99; //assigning out of range
//accessing out of range
for(i=0;i<20;i++){
cout<<arr[i]<<" ";
}
}
#OUT: 0 1 1 2 3 0 211951624 1 99 32766 -484579280 32766 -1740650656 32767 -484579408 32766 5 0 5 0