Как исправить «адрес стековой памяти, связанной с локальной переменной» при возврате адреса переменной из функции? - PullRequest
1 голос
/ 17 апреля 2019

Мой проф. попросил меня скопировать и вставить код, который она написала ниже, и он продолжал давать мне ошибки

Запустив ее программу, выведите 1 для любого значения.

Логически я понимаю, как функция должна возвращать адрес, и в основном она печатает его значение. Теоретически это.

Итак, вот что я попробовал:

1) Просто удалите оператор p = cube (& n) и замените на:

    std::cout << "Cube of " << n << " is " << cube(&n) << std::endl;

Это сработало.

2) Чтобы устранить ошибку «локальной переменной», я сделал «result» глобальной переменной.

3) В кубе () я сделал:

int *cube(int *number)
{
    int result = (*number) * (*number) * (*number);
    int *newResult = &newResult;
    return newResult;
}

... но он вывел 1 для любого целого числа.

Это пример кода, которым она поделилась.

#include <iostream>

int *cube(int *);

int main()
{
    int n, *p;
    std::cout << "Enter an int: ";
    std::cin >> n;

    p = cube(&n);

    std::cout << "Cube of " << n << " is " << *p << std::endl;

    return 0;
}

int *cube(int *number)
{
    int result = (*number) * (*number) * (*number);
    return &result;
}

По ее словам, вывод этой программы должен быть кубом введенного целого числа. Например, 3 в -> 27 в.

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 17 апреля 2019

result является локальной переменной и размещается в стеке. Когда эта функция заканчивается, память, принадлежащая результату, больше не действительна. Поэтому любой указатель на эту память недопустим.

Для простой функции нет необходимости беспокоиться о указателях. Просто верните копию результата по значению.

int cube(int *number)
{
    int result = (*number) * (*number) * (*number);
    return result;
}
0 голосов
/ 17 апреля 2019

Речь идет о области видимости переменных.

1.Глобальная переменная.

'Результатом' является локальная переменная, к которой нельзя получить доступ или использовать вне блока {and}.Вы можете использовать его с помощью глобальной переменной.

Глобальные переменные объявляются в верхней части программы вне всех функций или блоков.

static int result;
void cube(int *number)
{
    result = (*number) * (*number) * (*number);
}

В C вы можете передавать параметрына функцию по указателям.

void cube2(int *number)
{
    *number = (*number) * (*number) * (*number);
}

2.Передача по ссылке.

В C ++ вы можете передавать параметры в функцию либо с помощью указателей (cube2), либо с помощью кода ссылки blow:

void cube3(int &number)
{
   number = (number) * (number) * (number);
}

В основной функции:

int main()
{
    int input_num, n;
    std::cout << "Enter an int: ";
    std::cin >> n;

    input_num = n;
    cube(&n);

    std::cout << "Cube of " << input_num << " is " << result << std::endl;

    cube2(&n);
    std::cout << "Cube of " << input_num << " is " << n << std::endl;

    n = input_num;
    cube3(n);
    std::cout << "Cube of " << input_num << " is " << n << std::endl;

    return 0;
}
0 голосов
/ 17 апреля 2019

Вы пытаетесь вернуть локальную ссылку , к которой нельзя получить доступ за пределами области ее объявления. Вы должны выделить память в куче, используя ключевое слово new, а не стек. Проверьте разницу здесь .

int* cube(int number)
{
    return new int (number * number * number);
}

Обратите внимание, что я передаю number по значению, а не по ссылке, так как нет очевидных показателей скорости / необходимости изменять значение передаваемой переменной. Я также не беспокоюсь о создании промежуточной переменной newResult, так как результат new может быть просто возвращен. Помните, что если бы я создал промежуточное значение newResult, оно бы имело тип int*. НЕ забывайте возвращать память, когда вам больше не нужен результат. Используйте ключевое слово delete, чтобы освободить память. При этом не возвращайте указатель, так как использование кучи медленное, а ручное распределение памяти - грязное.

Ниже следует то, что вы должны использовать.

int cube(int number)
{
    return number * number * number;
}

Создание статических и глобальных переменных следует использовать с осторожностью, так как они будут использовать больше памяти.

Передача примитивной переменной по ссылке также не рекомендуется читать Причины не передавать простые типы по ссылке? .

void cube3(int &number)
{
   number = (number) * (number) * (number);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...