Пишу простенькую программу линейного поиска на vscode на macOS. Код выдает ошибку, называемую ошибкой сегментации, только в vscode. Но странно то, что код отлично работает на компиляторе onlinegdb и Xcode IDE. У меня на Mac установлен компилятор С++ по умолчанию, который появился после установки Xcode.
#include<iostream>
using namespace std;
int linearSearch(int arr[], int n, int key){
int i = 0;
for(i = 0; i<n;i++)
{
if (arr[i] == key){
return i;
}
} return -1;
}
int main(){
int n = 0;
int arr[n];
int key = 0;
cout<<"Enter the length of the array"<<endl;
cin>>n;
cout<<"Enter the elements of the array"<<endl;
int i = 0;
for(i = 0; i<n;i++)
{
cin>>arr[i];
}
cout<<"Enter the element to search in array"<<endl;
cin>>key;
cout<<linearSearch(arr, n, key);
}[screenshot of the error in vscode][1]
Помимо того факта, что массивы переменной длины не являются частью C++, как вы думаете, какой размер arr[n]
будет с n=0
?
Если у вас есть компилятор C++ и контейнеры STL, предпочтите std::vector
, std::list
, ... необработанному массиву C-Style.
Ошибка сегментации не является ошибкой vscode, это ошибка программы, она указывает на то, что ваша программа обращается к адресу памяти, который она не зарезервировала, поэтому ОС убивает вашу программу, чтобы спасти систему от неправильного или неправильного доступа к памяти.
Сначала вы инициализируете n 0, а затем инициализируете массив arr n целыми числами. Таким образом, это делает вас массивом с 0 целыми числами. Если вы хотите, чтобы это сработало, нажмите int arr[n]
под cin >> n
. Сначала вам нужно будет преобразовать его из строки в целое число, используя stoi()
библиотеки:
#include <string>
#include <iostream>
код:
//Create the int to store the length of the array
int n = 0;
//A string, beacause cin returns a string
std::string s;
//Get the number
std::cout << "Length of array: ";
std::cin >> s;
//Convert the string to an int
n = stoi(s);
//Create the array
int arr[n];
Для чего нужен stoi()?
@Neeraj-Kumar-Coder stoi() необходим для преобразования std::string, полученного из std::cin, в целое число, необходимое для создания массива. Вы не можете создать массив с длиной, представленной в виде строки, это должно быть число
Ну вот,
#include <iostream>
#include <sring>
using namespace std;
int n = 0;
string s;
//Get the number
cout << "Length of array: ";
cin >> s;
n = stoi(s);
int arr[n];
Дело не в том, что массивы переменной длины (VLA) не являются частью стандартного C++. Массив переменной длины (VLA) в компиляторах C++
Я удивлен
int arr[n];
даже компилируется. В любом случаеn
равно 0, когда вы объявляете массив. Где, по вашему мнению, будет находиться хранилище массива и где будет выделено хранилище?