在循环中显示不同值的初始化数组

Initialised arrays showing different values in a loop

本文关键字:初始化 数组 循环 显示      更新时间:2023-10-16

我初始化了一个数组并尝试使用循环和递归显示元素,但每次它显示的值都与原始值不同。 我尝试单独显示元素,它工作正常。

这是定义数组的类定义:

class stack
{
public:
int top, *arr;
stack(int s)
{
top=-1;
size=s;
arr=def_arr(s);
}
void push(int num)
{
if(top>=size-1)
{
cout<<"Stack has reached maximum length";
}
else
{
top++;
arr[top]=num;
}
}
int pop()
{
if(top>-1)
{
int temp;
temp=arr[top];
top--;
return temp;
} 
else
{
cout<<"The stack has no values";
}
}
void print()
{
if(top>-1)
{
for(int i=0; i<=top; i++)
{
cout<<arr[i];
cout<<"t";
}
}
else
{
cout<<"Can't print stack of length 0";
}
}
private:
int size;
int *def_arr(int size)
{
int arr[size];
return arr;
}
};

还有我运行的代码:

int main()
{
stack A(3);
A.push(5);
A.push(8);
A.push(10);
cout<<A.arr[1]<<"n";
A.print();
}

结果是:

8
5       87      -1259567440               

我错过了什么?

int *def_arr(int size)
{
int arr[size];
return arr;
}

是错误的,因为它返回指向局部变量arr的指针。一旦函数退出,局部变量就不再存在,因此指针指向无效地址(也称为悬空指针(。使用该指针是未定义的行为。

可变长度数组 (VLA( 是 C++ 中的非标准构造。

两种可能的解决方案

1( 使用 std::vector

#include <vector>
std::vector<int> def_arr(int size)
{
std::vector<int> arr(size);
return arr;
}

这将需要在代码中的其他地方进行更改(主要是类中的arr也必须重新声明为 std::vector(。

2( 使用动态内存分配

int *def_arr(int size)
{
int* arr = new int[size];
return arr;
}

这将导致代码中的内存泄漏,修复这些并非易事,您应该阅读"三法则"。

大多数人会推荐选项 1。恭喜您即将了解C++中最重要的主题,即资源管理。