Фиктивное значение выводится указателем - PullRequest
0 голосов
/ 07 мая 2019

Я передаю указатель структуры на функцию и обращаюсь к ней в функции, но указатель указывает на фиктивное значение после того, как он входит в эту функцию.

Вот код, который считывает значения пикселей

#define MAX_SIZE 50000
void readImage(Image * img)
{
    int pixels[MAX_SIZE];
    int a =0;

    for (int i = 0; i < 100; i++)
    {
        for (int j = 0; j < 100; j++)
        {
            pixels[a] = image.at<uchar>(i, j);
            a++;
        }
    }
    (*img).data = pixels;
}

Структура выглядит следующим образом:

struct Image {
        int *data;
    };

В основном я передаю этот объект структуры другой функции после прочтения:

int main()
{
 Image img;
 readImage(&img);

 std::cout << *(*img).data; // this prints first pixel value i.e. 0

 test(&img);
 return 0;
}

В тестовой функции я обращаюсь к нему следующим образом-

void test(Image * img)
{
 std::cout << *(*img).data;
}

Это выводит вывод как -858993460, но если выдает то же самое в основном, выводит 0

Есть ли какие-либо ошибки в вышеописанном методе, я хочу, чтобы функция Test выводила так же, какв main ()

Примечание: - Игнорировать ошибки отступа / синтаксиса, если таковые имеются

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Проблема с int pixels[MAX_SIZE]; внутри функции readImage. Он размещается в стеке и будет освобожден при возврате вызова. Вы должны выделить в куче, используя оператор new.

1 голос
/ 07 мая 2019

Вы выделяете информацию о пикселях в некоторой памяти из функции readImage().Это нормально.

Проблема заключается в том, что вы присваиваете это переменной img, которая является указателем.img хранит адрес переменной pixels, которая размещается в стеке.Но как только эта функция выходит из области видимости, она больше не доступна.Но так как вы присвоили это значение img и пытаетесь получить к нему доступ вне этой функции, вы получаете мусор значение в нем.

Решение этой проблемы заключается в том, что вы должны выделить память дляpixels в куче.Поэтому вместо того, чтобы делать:

int pixels[MAX_SIZE];

Распределить его по куче, используя:

int *pixels = (int *)malloc(MAX_SIZE * sizeof(int));  

или используя new, например:

int *pixels = new int[MAX_SIZE]; 

Просто будьте осторожныиспользовать free при использовании malloc и delete [] при использовании new

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