Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在这个有效的斐波那契函数中,不';它不能传递数组中可以存储的元素数吗?_C++_Arrays_Fibonacci - Fatal编程技术网

C++ 在这个有效的斐波那契函数中,不';它不能传递数组中可以存储的元素数吗?

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) {

这是我的代码,它是有效的。例如,当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)
        {
        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;i
for(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