2014-05-14 42 views
0

我不想推倒重来,所以我下载libtga它似乎有一个方便和简单的API。建设很容易,但我偶然发现了一个我无法解释的奇怪分段错误。一个小例子:libtga怪异分段故障

#include <stdio.h> 
#include "tga.h" 
#define TEST 

int main() 
{ 
    TGA *tga; 
    TGAData data; 

    tga = TGAOpen("test.tga", "r"); 
    if(!tga || tga->last != TGA_OK) 
    { printf("TGAOpen failed\n"); return 1; } 
    if(TGAReadImage(tga, &data) != TGA_OK) 
    { printf("TGAReadImage failed\n"); return 1; } 
    TGAHeader *header = &tga->hdr; 
    printf("image dimensions:\n width: %d\t height:%d\t depth:%d bpp\n", 
      header->width, header->height, header->depth); 
    tbyte *img = data.img_data; 

    if (img== NULL) 
    { 
     printf("Pointer wrong\n"); 
     return 1;    
    } 
    printf("pointer: %p\n", img); 

    printf("test %hhu\n", img[0]); 

#ifdef TEST  
    for(int i=0; i<header->height; i++) 
    { 
     for(int j=0; j<header->width; j++) 
     { 
      int index = 4*(i*header->width + j); 
      printf("%3d %3d %3d %3d | ", img[index], img[index+1], img[index+2], img[index+3]); 
     } 
     printf("\n"); 
    } 
#endif 
    TGAClose(tga); 
    return 0; 
} 

予编译程序以:GCC -g --std = C99 -O0 tgatest.c -L./lib -ltga -I./include现在

,如果“测试“被定义为一切工作正常,每个像素的值被打印到stdout(我使用4x4图像)。如果我不界定“TEST”它在行

printf("test %hhu\n", img[0]); 

我不明白为什么会引发分割故障。调试显示“img”是“地址0x1越界”,但使用 “TEST”它是一个有效的地址。任何建议如何进一步调查?我认为编译器可能会优化一些东西,但-O0不会改变任何东西。 --std = c99相同。

+0

我会说,因为测试被放在堆栈上(不可能的,但编译器是怪异)和IMG [0]期待到它的价值堆栈,img [0]看起来是空的它抓住测试的价值而不是? 什么'的printf( “测试%HHU \ n” 个,IMG [0]);'实际上导致TEST被定义时? – JasonSec

+0

你应该在使用前检查你的指针。你可能有未定义的指针。如果这似乎与TEST一起工作,那只是一个运气! – daouzli

+0

如果你想重新发明轮子,你应该解释你自己的Targa图像。这很容易。 – daouzli

回答

3

根据tgalib documentation,您需要在data->flags上设置TGA_IMAGE_DATA,然后致电TGAReadImage确保读取图像数据。在TEST构建中,可能在数据变量下堆栈中的垃圾恰好设置了该位,但在另一个构建中没有。

添加像线的TGAReadImage调用之前应该做的伎俩紧随其后:

data.flags = TGA_IMAGE_DATA; 
+0

在我的具体情况下,它会是“data.flags”,因为它不是一个指针。 –

+0

修正了这个例子。 –