我刚刚开始用C ++编程,我遇到了从我定义的结构访问数组的问题。
我正在使用OpenGL使用纹理将一组像素数据绘制到屏幕上。像素数据数组存储在Image结构中:
struct Image {
GLubyte *pixels;
int width;
int height;
int bitrate;
Image(int w, int h, GLubyte* pixels, int bitrate){
this->width = w;
this->height = h;
this->pixels = pixels;
this->bitrate = bitrate;
}
};
图像初始化如下:
GLubyte* pix = new GLubyte[WIDTH*HEIGHT*3];
Image image(WIDTH, HEIGHT, pix, 3);
有一个名为Screen的独立结构,它使用Image实例初始化:
struct Screen{
int width, height;
Image* screen;
void setScreen(Image* screen, const int width, const int height){
this->screen = screen;
this->width = width;
this->height = height;
}
};
屏幕初始化如下(图像声明后):
displayData = new Screen();
displayData->setScreen(&image, WIDTH, HEIGHT);
当我访问Width或Height变量时,它会获得正确的值。然后我将屏幕实例传递给此方法:
void renderScreen(Screen *screen){
std::cout << "Rendering Screen" << std::endl;
for(int x = 0; x < screen->width; x++){
for(int y = 0; y < screen->height; y++){
std::cout << "rendering " << x << " " << y << std::endl;
//Gets here and crashes on x - 0 and y - 0
screen->write(0xFFFFFFFF, x, y);
}
}
std::cout << "done rendering Screen" << std::endl;
}
这样称呼:
render(displayData); (displayData is a Screen pointer)
指针对我来说是一个新手,我不知道将指针传递给结构或类似的东西的规则。
答案 0 :(得分:3)
displayData->setScreen(&image, WIDTH, HEIGHT);
这似乎指出你通过获取局部变量的地址来传递指向Image
的指针,例如。
void method() {
Image image;
displayData->setScreen(&image, ..)
}
在这种情况下,image
在堆栈上分配,并且在退出声明该局部变量的作用域后,指向它的指针不再有效。
你应该在堆上分配它:
Image *image = new Image(..);
displayData->setScreen(image, ...);
以这种方式,对象将继续存在,直到您使用delete image
明确删除它。