指针转换期间EXC_BAD_ACESS在运行时

时间:2011-12-05 22:07:43

标签: c macos lldb

我试图在这里找到错误,调试器停在以下位置:

Pthread_create renderer passed

Renderer loop (re)started

Process 84779 stopped

* thread #4: tid = 0x3603, 0x0000000101546c4b libjess.so`render_deformation + 667 at renderer.c:472, stop reason = EXC_BAD_ACCESS (code=1, address=0x36f0000)

    frame #0: 0x0000000101546c4b libjess.so`render_deformation + 667 at renderer.c:472

   469         for (i = 0; i < resy*resx; i++)

   470       {

   471         aux  =  (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);

-> 472         *pix = *(aux) ;

   473         pix++;

   474         *pix = *(aux + 1);  
   475         pix++;

我怀疑它与指针转换有关。任何人都可以告诉我投射它的最佳方法。

该功能的完整代码(根据要求):

void render_deformation(int defmode)
{
   unsigned int bmax, *tab1, *tab2, *tab3, *tab4, i;
   unsigned char *pix = pixel , *buf = buffer, *aux;


   SDL_LockSurface(screen);

   /**************** BUFFER DEFORMATION ****************/



   if (video == 8)
     {
       buf = buffer;
       tab1 = table1;
       tab2 = table2;
       tab3 = table3;
       tab4 = table4;
       bmax = resx * resy + (unsigned int) pixel;

       switch(defmode)
     {
     case 0:
       memcpy(pixel,buffer,resx * resy);
       break;
     case 1:
       for (pix = pixel; pix < (unsigned char *) bmax ; pix++)
         *pix = *(buffer + *(tab1++)) ;
       break;
     case 2:
       for (pix = pixel; pix < (unsigned char *) bmax; pix++)
         *pix = *(buffer + *(tab2++)) ;
       break;
     case 3:
       for (pix = pixel; pix < (unsigned char *) bmax; pix++)
         *pix = *(buffer + *(tab3++)) ;
       break;
     case 4:
       for (pix = pixel; pix < (unsigned char *) bmax; pix++)
         *pix = *(buffer + *(tab4++)) ;
       break;   
     default:
       printf("Problem with blur_mode\n");
     }
     }
   else
     {
       pix = pixel;

       bmax = resx * resy;
       switch(defmode)
     {
     case 0:
       memcpy(pixel, buffer, pitch * resy);
       goto nodef;
       break;
     case 1:
       tab1 = table1;
       break;
     case 2:
       tab1 = table2;
       break;
     case 3:
       tab1 = table3;
       break;
     case 4:
       tab1 = table4;
       break;

     default:
       printf("Problem with blur_mode\n");
     }
       for (i = 0; i < resy*resx; i++)
     {
       aux  =  (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);
       *pix = *(aux) ;
       pix++;
       *pix = *(aux + 1);  
       pix++;
       *pix = *(aux + 2);  
       pix+=2;
       tab1++;
     }
       nodef:;

     }


   SDL_UnlockSurface(screen);
}

2 个答案:

答案 0 :(得分:3)

aux = (unsigned char ) (((tab1) << 2 ) + (unsigned int) buffer);

我的猜测应该是:

aux = (unsigned char *) (((tab1) << 2 ) + (unsigned int) buffer);

255是指针的一个非常小的值或范围......

但是需要更多的代码,至少整个函数加上相关的定义/声明(什么是“缓冲区”?,为什么要转换为unsigned int?)。

更新111206:

似乎也是如此
bmax = resx * resy + (unsigned int) pixel;

应该是:

bmax = resx * resy + (unsigned int*) pixel;

aux  =  (unsigned char *) ((*(tab1) << 2 ) + (unsigned int) buffer);

哪个应该是

aux  =  (unsigned char) ((*(tab1) << 2 ) + (unsigned int*) buffer);

或:

aux  =  (unsigned char*) ((*(tab1) << 2 ) + (unsigned int) buffer);

这是所有基本指针算术:它是pointer := pointer + scalar;pointer = scalar + pointer;,但pointer := pointer + pointer;没有意义。第一个变体是最可能的变体(否则演员阵容不是必需的)。

不确定类型大小,但它们至少应该是指针。

还有一些错误的输入:

for (pix = pixel; pix < (unsigned char *) bmax ; pix++) {...}

像素和像素是char *; bmax是unsigned int;演员发臭。我希望有类似的东西:

for (pix = pixel; pix < pixel+bmax ; pix++) {...}

,可能限制(bmax)甚至应该乘以4,以便为每个单元格的24 + 8位颜色空间提供支持。

答案 1 :(得分:0)

可能发生的是,在第472行和第474行,您将数据存储到由aux指向的地址中的pix所指向的内存地址,但您的进程无法访问其中一个或两个地址。确保正确分配该内存。