首页 > 解决方案 > stbi_load() 返回空字符串“”

问题描述

我使用 stbi_load 具有以下功能:

void load_texture_from_file(const char *file, bool alpha, const char *name) {
    Texture *tex;
    tex = malloc(sizeof(Texture));
    tex->name = name;

    int width, height, channels;
    unsigned char *data = stbi_load(file, &width, &height, &channels, 0); 
    generate_texture(width, height, data, tex, alpha); 
    
    stbi_image_free(data);
}

文件来自:

load_texture_from_file("/home/correct_folder/correct_name.png", true, "sprite");

使用 stbi_failure_reason() 没有错误,使用 gdb 检查数据内容时,我看到:

Thread 1 "a" hit Breakpoint 2, load_texture_from_file (file=0x555555579d18 "/home/correct_folder/correct_name.png", 
    alpha=true, name=0x555555579d12 "face") at resource_manager.c:25
25          generate_texture(width, height, data, tex, alpha); 
(gdb) print data
$1 = (unsigned char *) 0x7ffff40c1010 ""

我错过了什么?

标签: cstb-image

解决方案


要扩展@HolyBlackCat 的评论,您在加载数据方面可能根本没有做错任何事情。您应该尝试使用 gdb 来检查内存,而不是printing 它,它被data视为字符串。您可以使用以下命令在 gdb 中执行此操作:

x/nfu <address>

在哪里

  • x/是“检查记忆”命令
  • n是您要检查的内存单元/元素的数量
  • f是显示格式('x' 表示十六进制,'d' 表示十进制等。请参见下面的链接)
  • u是单位/元素格式('b' 表示字节,'w' 表示单词等。请参见下面的链接)
  • address是您要开始检查内存的地址

例如,要查看data十六进制格式的前 5 个字节,您可以输入

x/5xb data

要查看十六进制格式的前十个 4 字节字,您可以输入

x/10xw data

有关更多信息和所有参数选项的详尽列表,请参阅此页面


推荐阅读