指针输出的虚拟值

时间:2019-05-07 05:49:58

标签: c++ pointers image-processing

我正在将结构指针传递给函数并在函数中对其进行访问,但是当指针进入该函数后,该指针指向虚拟值。

这是读取像素值的代码

#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;
    };

主要是在阅读后,我将此Structure对象传递给另一个函数:

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 但是如果在main中打印相同的内容,则会输出0

上述方法中是否有任何错误,我想让Test函数输出的结果与main()相同

注意:-忽略缩进/语法错误

2 个答案:

答案 0 :(得分:2)

int pixels[MAX_SIZE];函数中的readImage存在问题。它分配在堆栈上,并在调用返回时释放。您必须使用new运算符在堆上进行分配。

答案 1 :(得分:1)

您正在通过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]; 

如果使用freemalloc,请小心使用delete []