Возвращаемый адрес цели в массиве - PullRequest
0 голосов
/ 07 декабря 2018

Я не могу определить свою ошибку.Мне нужно создать функцию int search (int *p, int s, int n), которая будет искать в массиве цель, и если она будет найдена, она вернет адрес, а если не найдет, вернет NULL;

#include <iostream>
using namespace std;

int search(int *p , int s, int n)
{
    for(int i = 0; i < s; i++)
    {
        if(*p == n)
            return &p;
        p++;
    }

    return NULL; 
}

int main()
{
    int n;
    int arr[6] = {1, 2, 3, 4, 5, 6};

    cout << "Enter target: "<< endl;
    cin >> n;

    cout << search(arr, 6, n) << endl;

    return 0;
} 

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018
#include <iostream>
#include <memory>
#include <algorithm>
#include <vector>

void findItemInVec(std::vector<int> &v ,int number) {
    std::for_each(v.begin(), v.end(), [number](int &item_in_vec) ->void {
        if (item_in_vec == number) {
            std::cout << &item_in_vec << std::endl;
        }
    });
}


int main()
{   
    std::vector<int> v{ 1,2,5,8,7,6,1 };

    findItemInVec(v, 1);
    return 0;
}

Аргумент в функции - это вектор целочисленных значений.Функция std :: for_each проверяет каждый элемент внутри вектора с помощью итераторов и проверяет, имеет ли он то же значение, что и аргумент number.Для каждой проверки, которая возвращает true, он вводит адрес этого элемента.

0 голосов
/ 07 декабря 2018

Вы почти там:

return &p;

Это проблема, с которой вы столкнулись: вы возвращаете адрес локального указателя, который вы используете для перебора входного массива.

Поскольку вы использовали if(*p == n) в своем коде, я полагаю, что вы знали, что p уже является указателем.Затем, найдя элемент, вы должны просто вернуть его сразу:

return p;
0 голосов
/ 07 декабря 2018

Возвращение &p определенно является ошибкой.p является параметром функции, и его срок службы не заканчивается после окончания его функции.В обычной реализации он находится в стеке и исчезает во время возврата, или, точнее, может быть перезаписан в любое время после возврата функции.

Но вам это не нужно.Если вам нужен целочисленный индекс, вам нужно:

return i;

, а если вы действительно хотите адрес, вы должны иметь:

int* search ( int *p , int s, int n)        // returns an int* not an int
{
    for(int i = 0; i<s;i++)
    {
        if(*p==n)
        return p;
       p++;
    }
    return NULL;  // you should return a defined value if not found
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...