gpt4 book ai didi

c - libtga 奇怪的段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:17:15 24 4
gpt4 key购买 nike

我不想重新发明轮子,所以我下载了libtga它似乎有一个方便简单的 API。构建很容易,但我偶然发现了一个我无法解释的奇怪的段错误。一个小例子:

#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 编译程序

现在,如果定义了“TEST”,一切正常,每个像素的值都打印到标准输出(我使用 4x4 图像)。如果我没有定义“TEST”,它会在

行抛出一个段错误
printf("test %hhu\n", img[0]);

我不明白为什么。调试显示“img”是“Address 0x1 out of bounds”,但是与“TEST”是一个有效的地址。任何建议如何进一步调查这个?我认为编译器可能会优化一些东西,但 -O0 不会改变任何东西。 --std=c99 相同。

最佳答案

根据tgalib documentation在调用TGAReadImage 之前,您需要在data->flags 上设置TGA_IMAGE_DATA,以确保读取图像数据。有可能在 TEST 构建中,数据变量下堆栈上的垃圾恰好设置了该位,但在其他构建中没有。

TGAReadImage 调用之前添加如下一行应该可以解决问题:

data.flags = TGA_IMAGE_DATA;

关于c - libtga 奇怪的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23662243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com