【发布时间】:2020-02-06 22:24:36
【问题描述】:
在下面的代码中调用get_array() 的方法出现问题,因为capacity 变量在用户在控制台中首次输入后更改为
和capacity 值分配给用户给出的值
我不确定发生了什么,但这让我很恼火,还是我错过了一些基本知识?请帮忙
#软件
我正在使用 CodeBlocks v17.12
#操作系统
Windows 10 家庭版
#include <iostream>
using namespace std;
class LinearSearch
{
int my_arr[];
int capacity, c, val;
public:
LinearSearch()
{
this->capacity = 0;
this->c = 0;
this->val = 0;
}
void get_array()
{
cout << "Define number of elements in the array: ";
cin >> this->capacity;
for( int i = 0; i < this->capacity; i++ )
{
cout << "Enter value " << i+1 << " - " << this->capacity << " : ";
cin >> this->my_arr[i];
}
for( int k = 0; k < capacity; k++ )
{
cout << my_arr[k] << endl;
}
cout << endl;
}
void search_value()
{
cout << endl << "Enter a value to search: ";
cin >> this->val;
for(int j = 0; j < capacity; j++)
{
if(my_arr[j]==val)
{
cout << endl << this->val << " value found in the array at index array[" << j << "] value number " << j+1 << "." << endl << endl;
c++;
break;
}
}
if(this->c==0)
cout<<endl<<this->val<<" value not found in the array."<<endl<<endl;
}
};
int main()
{
int choice;
LinearSearch obj;
while( true )
{
cout << "0) Exit\n1) Insert Data\n2) Search Data\n\nEnter Option: ";
cin >> choice;
switch( choice )
{
case 0:
return 0;
case 1:
obj.get_array();
break;
case 2:
obj.search_value();
break;
default:
cout << "\nWrong Option!!\n\n";
break;
}
}
return 0;
}
【问题讨论】:
-
正如我在回答中所写,
int my_arr[];不是有效的 C++,也不是您编写的有效 C。你用哪个编译器来编译这个?我测试的主要三个都给出错误:godbolt.org/z/oWakgD -
GCC 编译器没有显示任何错误,所以我认为它是有效的 .而且我知道如何在没有大小的情况下声明数组,但是我尝试过这种方式,它不会显示任何错误,这就是为什么我认为它是有效的现在,我的意思是为什么要更改
capacity变量,尽管这是一个问题一个数组的声明? -
你是对的,旧版本的 GCC 编译它没有错误,参见*.com/questions/38130887/…。但是,这仍然是不允许的。那是编译器中的一个错误。最佳情况下,它将被视为一个长度为零的数组,在这种情况下,您会越界访问它,从而导致undefined behavior。在 C++ 中,仅仅因为没有错误并不意味着程序是格式良好的。
-
我推荐了一个good book 来学习C++。您必须学习语言规则。试错法在 C++ 中不起作用,因为许多规则在违反时不会导致任何警告或错误,并且程序可能似乎工作,即使它是错误的并且具有未定义的行为。跨度>
-
当你输入一个容量值时,你应该在内存中创建数组。
my_arr = new int[this->capacity];之类的东西看起来你的数组有 0 个元素。因此,当您尝试填充它时,实际上是在破坏 my_arr 变量之后的数据。