我正在将结构指针传递给函数并在函数中对其进行访问,但是当指针进入该函数后,该指针指向虚拟值。
这是读取像素值的代码
#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()相同
注意:-忽略缩进/语法错误
答案 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];
如果使用free
和malloc
,请小心使用delete []