在C ++中重新分配指针引用

时间:2011-03-16 18:35:57

标签: c++ pointers

这让我疯狂,我觉得我几乎尝试过所有事情。

SDL_Surface * Cell::image=NULL;


//somewhere in main
Cell::LoadSurface(Cell::image, "image.bmp");

void Cell::LoadSurface(SDL_Surface * surf, char * filename)
{
 if(surf == NULL) 
 {
   SDL_Surface *temp;
   SDL_Surface **temp2 = &surf;
   temp = SDL_LoadBMP(filename);

   if(temp == NULL)
     printf("Cannot Load Image\n");
   else
     printf("Image Loaded\n");
   surf = SDL_DisplayFormat(temp);
   //*surf = *SDL_DisplayFormat(temp); //segfault

   Uint32 colorkey = SDL_MapRGB(surf->format, 0, 0, 0 );
   SDL_SetColorKey(surf, SDL_SRCCOLORKEY | SDL_RLEACCEL , colorkey);

   SDL_FreeSurface(temp);
 }

Image和LoadSurface都是静态的。无论分配给它的是什么,图像始终保持为null,否则程序将以段落错误终止,就像在注释行中一样。

谢谢,

4 个答案:

答案 0 :(得分:3)

通过引用传递surf以允许surf中的更改反映回输入Cell::image

void Cell::LoadSurface(SDL_Surface*& surf, char* filename) {
//                                 ^
   ...

答案 1 :(得分:2)

当您调用LoadSurface时,您正在创建(图像)指针的副本。 您可以使用指针引用:

void Cell::LoadSurface(SDL_Surface *& surf, char * filename)

或使用指向指针的指针:

void Cell::LoadSurface(SDL_Surface ** surf, char * filename)

请注意,在稍后您需要将呼叫更改为:

Cell::LoadSurface(&Cell::image, "image.bmp");

并更改LoadSurface以将surf视为指向指针的指针。

答案 2 :(得分:0)

传递给函数调用时会复制指针地址。这意味着当您在函数

中调用时
surf = SDL_DisplayFormat(temp);

实际上你只是覆盖了Cell :: image地址的副本。

要修复此问题,您必须传入Cell :: image指针的地址,以便知道要使用新指针值更新哪个内存地址。

答案 3 :(得分:0)

感谢您的所有回复,我非常感谢您的帮助。

但事实证明,无法创建SDL_Surface结构的指针引用。由于SDL_Surface包含其他其他指针。我相应地重构了我的代码(改为返回SDL_Surface)。这使得这更像是与SDL相关的问题,而不是与c ++相关的问题。