ошибка сегментации в указателях при обработке массивов - PullRequest
0 голосов
/ 29 апреля 2020

Я пытаюсь умножить элементы массива на 5, но получаю ошибку дампа памяти, и если нет, то он только умножает 5 на первый элемент.

Здесь код:

    #include <iostream>
    using namespace std;

    int ptr_multiply(int[],int);
    int main(){

        int size;

        cout<<"Enter the size of an array ==";
        cin>>size;

        int arr[size];


        cout<<"Enter the elements of array ==";

        for (int i=0;i<size;i++){

        cin>>arr[i];
        }

        ptr_multiply(arr,size);

        }

    int ptr_multiply(int a1[],int s1){

        int *ptr;   


        for (int i=0;s1;i++)
        {

            *ptr=a1[i];

            ptr*=5;

            cout<<"The Elements"<<" "<< i <<" "<<" after multiplying 5 is =="<<*ptr;

        }}

1 Ответ

2 голосов
/ 29 апреля 2020
*ptr=a1[i];
ptr*=5;

Первая строка: вы разыменовываете указатель, который нигде не указывает (он не инициализирован). Это неправильно и вызывает неопределенное поведение. Вы пытаетесь присвоить int, когда нет int.

Вторая строка: Вы не разыменовываете указатель. Вы умножаете значение указателя на 5, когда вы действительно хотите умножить int, на который он указывает, на 5 (помните: int на который он указывает).

Вы делаете указатель здесь не нужен:

for (int i=0;i < s1;i++) {
    int value = a1[i];
    value *= 5;
    cout<<"The Elements"<<" "<< i <<" "<<" after multiplying 5 is =="<<value;
}

Также условие было неправильным. Это должно быть i < s1.

И последнее, но не менее важное: не используйте C -массивы в C ++. Они сложны в использовании и подвержены ошибкам. Предпочитайте std::array для массивов фиксированного размера и std::vector для динамического размера c. На самом деле int arr[size]; не является стандартом C ++, см. Почему массивы переменной длины не являются частью стандарта C ++?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...